@trismegisto/spine 2.1.2 → 3.0.0
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/README.md +74 -17
- package/fesm2022/trismegisto-spine-audit.mjs +264 -10
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs +84 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-BAKdkVdz.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-CAXMP5r8.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs → trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs} +6 -5
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-B75d4mh2.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs → trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs} +9 -8
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-IdXMruv5.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs} +4 -4
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-CCiz-q8o.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-BIL8tH1I.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-Z0wCANF6.mjs.map → trismegisto-spine-auto-service-auto-service-client-picker.component-CBt_0Uli.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs → trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs} +123 -27
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-DAxhZC-a.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs +87 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CoJYTtBU.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs +544 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-UVMGF7-B.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-login-attempts.component-Boi-kG0G.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs +943 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-DmLafUkX.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs → trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs} +24 -3
- package/fesm2022/trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs → trismegisto-spine-auto-service-client.usage-CcJANb20.mjs} +15 -6
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CcJANb20.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs +65 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-BlktCM70.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs +81 -0
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Cz5sCKgn.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs → trismegisto-spine-auto-service-home.component-5_aji1hf.mjs} +5 -4
- package/fesm2022/trismegisto-spine-auto-service-home.component-5_aji1hf.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs +37 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.technical-CasKIIws.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs +60 -0
- package/fesm2022/trismegisto-spine-auto-service-login-attempts.usage-BMgLNu7W.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +49 -29
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout.mjs +1698 -156
- package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +17 -1
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +1157 -85
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-audit.d.ts +180 -5
- package/types/trismegisto-spine-audit.d.ts.map +1 -1
- package/types/trismegisto-spine-auto-service.d.ts +100 -7
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +833 -13
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts +8 -0
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +491 -32
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs +0 -48
- package/fesm2022/trismegisto-spine-auto-service-apps.technical-ClMKB9cK.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs +0 -55
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-Cf5SG-oQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.technical-C901aIIQ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-audit.usage-GIJ2RwuH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-C7SPavrX.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-6Bk46MOf.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs +0 -357
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-CqIVe2LU.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs +0 -502
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLN49F4a.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.technical-BHWhpyWv.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CM2WB2e2.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs +0 -39
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-jQlwaQPn.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs +0 -54
- package/fesm2022/trismegisto-spine-auto-service-groups.usage-Bh7ig2zZ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-home.component-vl3BPFnk.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-layout.mjs","sources":["../../../projects/ui/layout/src/header/app-launcher.component.ts","../../../projects/ui/layout/src/header/app-launcher.component.html","../../../projects/ui/layout/src/brand.token.ts","../../../projects/ui/layout/src/header/brand.component.ts","../../../projects/ui/layout/src/onboarding/onboarding.service.ts","../../../projects/ui/layout/src/news/news.service.ts","../../../projects/ui/layout/src/logout/logout.service.ts","../../../projects/ui/layout/src/settings/settings.service.ts","../../../projects/ui/layout/src/shortcuts/shortcut.service.ts","../../../projects/ui/layout/src/header/header.component.ts","../../../projects/ui/layout/src/header/header.component.html","../../../projects/ui/layout/src/workspace/spine-workspace-nav.service.ts","../../../projects/ui/layout/src/sidebar/sidebar.component.ts","../../../projects/ui/layout/src/sidebar/sidebar.component.html","../../../projects/ui/layout/src/onboarding/onboarding-placement.ts","../../../projects/ui/layout/src/onboarding/onboarding-overlay.component.ts","../../../projects/ui/layout/src/onboarding/onboarding-overlay.component.html","../../../projects/ui/layout/src/news/news-illustration.ts","../../../projects/ui/layout/src/news/news.component.ts","../../../projects/ui/layout/src/shortcuts/shortcuts-cheatsheet.component.ts","../../../projects/ui/layout/src/shortcuts/shortcuts-cheatsheet.component.html","../../../projects/ui/layout/src/settings/account-security.service.ts","../../../projects/ui/layout/src/settings/account-security.state.ts","../../../projects/ui/layout/src/settings/account-reauth.component.ts","../../../projects/ui/layout/src/settings/account-mfa.component.ts","../../../projects/ui/layout/src/settings/account-mfa.component.html","../../../projects/ui/layout/src/settings/account-recovery-codes.component.ts","../../../projects/ui/layout/src/settings/account-sessions.component.ts","../../../projects/ui/layout/src/settings/account-sessions.component.html","../../../projects/ui/layout/src/settings/app-tokens.service.ts","../../../projects/ui/layout/src/settings/app-tokens.component.ts","../../../projects/ui/layout/src/settings/app-tokens.component.html","../../../projects/ui/layout/src/settings/settings-panel.component.ts","../../../projects/ui/layout/src/settings/settings-panel.component.html","../../../projects/ui/layout/src/docs/docs.service.ts","../../../projects/ui/layout/src/workspace/spine-page-bar.component.ts","../../../projects/ui/layout/src/workspace/spine-page-panel.component.ts","../../../projects/ui/layout/src/workspace/panel-local-link.directive.ts","../../../projects/ui/layout/src/docs/markdown-sanitize.ts","../../../projects/ui/layout/src/docs/markdown.component.ts","../../../projects/ui/layout/src/docs/docs-modal.component.ts","../../../projects/ui/layout/src/connection/connection-banner.component.ts","../../../projects/ui/layout/src/layout.component.ts","../../../projects/ui/layout/src/trismegisto-spine-layout.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { AppDef, AuthorizationService, RealmAppsService } from '@orfeu/angular/core';\nimport { IconButtonComponent, IconComponent, LoadingSquareComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * A grade de apps não cabe no `MenuItem` de linha única do `hm-menu` (ícone grande + nome\n * embaixo, em coluna) — em vez de forçar isso num componente pensado pra lista de ações, usa\n * um popover próprio (mesmo padrão do backdrop-fecha-fora da busca global do header).\n */\n@Component({\n selector: 'spine-app-launcher',\n imports: [CommonModule, IconComponent, IconButtonComponent, LoadingSquareComponent],\n templateUrl: './app-launcher.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './app-launcher.component.scss',\n})\nexport class AppLauncherComponent implements OnInit {\n protected readonly text = inject(SPINE_MESSAGES).header;\n private readonly cdr = inject(ChangeDetectorRef);\n\n public apps: AppDef[] = [];\n public loading = false;\n public open = false;\n\n constructor(\n private authService: AuthorizationService,\n private realmAppsService: RealmAppsService,\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.loading = true;\n const token = this.authService.getToken();\n // O client atual (o app em que o usuário já está) já vem excluído aqui —\n // OpenIDController.view no argos filtra por client_id no próprio backend\n // (apps/argos/auth/server/.../openid.controller.ts), então não há\n // necessidade de repetir essa checagem no front.\n try {\n this.apps = (await this.realmAppsService.getApplications(token)) ?? [];\n } catch {\n // Sem a lista não há o que oferecer: o botão some, em vez de ficar carregando para sempre.\n this.apps = [];\n } finally {\n this.loading = false;\n // A lista chega fora de qualquer evento do template: sem isto, app zoneless não redesenha.\n this.cdr.markForCheck();\n }\n }\n\n toggle(): void {\n this.open = !this.open;\n }\n\n close(): void {\n this.open = false;\n }\n}\n","<div class=\"app-launcher-trigger\" data-tour=\"apps\" *ngIf=\"loading || apps.length > 0\">\n <hm-icon-button emphasis=\"subtle\" icon=\"grid\" [label]=\"text.apps\" (clicked)=\"toggle()\"></hm-icon-button>\n\n <button type=\"button\" class=\"app-launcher-backdrop\" *ngIf=\"open\" (click)=\"close()\" aria-hidden=\"true\"></button>\n\n <div class=\"app-launcher-menu\" *ngIf=\"open\">\n <div class=\"app-launcher-header\">{{ text.apps }}</div>\n <div class=\"app-launcher-grid\">\n <div class=\"app-launcher-loading\" *ngIf=\"loading\">\n <hm-loading-square></hm-loading-square>\n </div>\n <a *ngFor=\"let app of apps\" [href]=\"app.app_url\" class=\"app-launcher-card\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <div class=\"app-launcher-icon\">\n <hm-icon shape=\"applications\" size=\"32\"></hm-icon>\n </div>\n <span class=\"app-launcher-name\">{{ app.name }}</span>\n </a>\n </div>\n </div>\n</div>\n","import { InjectionToken, Type } from '@angular/core';\n\n/**\n * Componente de marca que o header do shell desenha no lugar da imagem de `SpineConfig.logo` (tem\n * prioridade sobre ela). Injeção em vez de projeção de conteúdo porque o `LayoutComponent` é montado\n * pelo `Router`, não pelo template do app — não existe `<ng-content>` alcançável de fora. O componente\n * fica dentro do link da marca (que leva à home): não ponha link nem botão nele, e se ele for só\n * imagem, dê nome acessível ou deixe o `appName` visível (`showAppName`, padrão `true`).\n * `null` (padrão) usa a imagem. Ex.: `{ provide: SPINE_BRAND, useValue: MarcaComponent }` no\n * `app.config.ts`.\n */\nexport const SPINE_BRAND = new InjectionToken<Type<unknown> | null>('SPINE_BRAND', {\n providedIn: 'root',\n factory: () => null,\n});\n","import { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { SPINE_CONFIG, ThemeService, resolveSpineLogo } from '@trismegisto/spine';\nimport { SPINE_BRAND } from '../brand.token';\n\n/**\n * Marca do header: logo do app (`SpineConfig.logo`, padrão `assets/images/logo.svg`) + `appName`, dentro\n * de um link para a home. Ordem: componente de `SPINE_BRAND` > imagem > só o nome.\n *\n * - Tema escuro usa `logo.dark` quando houver; se ele falhar, volta para `logo.light`.\n * - Imagem que não carrega (404/erro) some — nada de ícone quebrado — e o nome aparece mesmo com\n * `showAppName: false`, para o link nunca ficar sem texto.\n * - Texto alternativo: `logo.alt` se configurado; senão o `appName` quando o nome está escondido, e vazio\n * (imagem decorativa) quando o nome já está ao lado — o leitor de tela não lê o nome duas vezes.\n */\n@Component({\n selector: 'spine-brand',\n imports: [RouterLink, NgTemplateOutlet, NgComponentOutlet],\n template: `\n @if (homeRoute()) {\n <a class=\"brand\" [routerLink]=\"homeRoute()\" [title]=\"label()\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </a>\n } @else {\n <span class=\"brand\" [title]=\"label()\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </span>\n }\n <ng-template #content>\n @if (brand) {\n <ng-container *ngComponentOutlet=\"brand\" />\n } @else if (src(); as s) {\n <img class=\"brand__logo\" [src]=\"s\" [alt]=\"alt()\" (error)=\"onError(s)\" />\n }\n @if (nameVisible()) {\n <span class=\"brand__name\">{{ appName }}</span>\n }\n </ng-template>\n `,\n styleUrl: './brand.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpineBrandComponent {\n /** Rota da home (primeira rota navegável); `null` desenha a marca sem link. */\n readonly homeRoute = input<string | null>(null);\n /** Dica do link (ex.: \"Página inicial\"). */\n readonly label = input('');\n\n private readonly config = inject(SPINE_CONFIG, { optional: true });\n private readonly theme = inject(ThemeService);\n protected readonly brand = inject(SPINE_BRAND);\n protected readonly appName = this.config?.appName ?? 'Hermes';\n private readonly sources = resolveSpineLogo(this.config?.logo);\n private readonly showAppName = this.config?.showAppName !== false;\n /** Endereços que já deram erro nesta sessão do componente. */\n private readonly failed = signal<ReadonlySet<string>>(new Set());\n\n /** Imagem a mostrar agora (tema atual, sem as que falharam); `null` = nenhuma. */\n readonly src = computed<string | null>(() => {\n const logo = this.sources;\n if (!logo || this.brand) return null;\n const failed = this.failed();\n if (this.theme.current === 'dark' && logo.dark && !failed.has(logo.dark)) return logo.dark;\n return failed.has(logo.light) ? null : logo.light;\n });\n\n readonly nameVisible = computed(() => this.showAppName || (!this.brand && !this.src()));\n\n readonly alt = computed(() => this.sources?.alt ?? (this.nameVisible() ? '' : this.appName));\n\n onError(src: string): void {\n if (this.failed().has(src)) return;\n this.failed.update((set) => new Set(set).add(src));\n }\n}\n","import { Inject, Injectable, Optional, inject } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { SPINE_CONFIG, SpineConfig, SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Fase do tour: `idle` (inativo: não é devido, terminou, foi pulado/interrompido ou não sobrou passo),\n * `pending` (vai aparecer: desde o `maybeStart()`/`restart()` até o primeiro passo, enquanto espera o\n * shell e os alvos) e `running` (um passo na tela). Quem não pode disputar a tela com o tour (o painel\n * de novidades) espera `idle` — não um tempo fixo.\n */\nexport type OnboardingState = 'idle' | 'pending' | 'running';\n\nexport interface OnboardingStep {\n /** seletor CSS do alvo; ausente = passo centralizado (boas-vindas/encerramento). */\n target?: string;\n title: string;\n /** pode conter HTML simples (<b>). */\n description: string;\n}\n\n// Entra na chave de \"já visto\": trocar a versão faz o tour aparecer de novo para todo mundo.\nconst ONBOARDING_VERSION = 'v3';\n\n// Espera antes de procurar os alvos na entrada automática: header/breadcrumb renderizados.\nconst START_DELAY_MS = 700;\n\n// Partes do shell chegam depois do login (abas, barra de página): o tour espera por elas, mas não\n// para sempre. Os passos cujo alvo não apareceu no prazo ficam de fora.\nconst TARGET_WAIT_MS = 3000;\nconst TARGET_POLL_MS = 150;\n\n/**\n * Primeiro elemento do seletor que está de fato na tela (tem tamanho e conteúdo). Não usa\n * `offsetParent`: ele é `null` pra `position: fixed` (a sidebar) e pra `display: contents`, e o\n * passo sumia do tour mesmo com o alvo visível. Com as abas vivas do workspace há uma barra de\n * página por aba — só a da aba ativa tem tamanho, e é ela que o holofote precisa achar.\n */\nexport function findTourTarget(selector: string): HTMLElement | null {\n for (const el of Array.from(document.querySelectorAll<HTMLElement>(selector))) {\n const r = el.getBoundingClientRect();\n if (r.width > 0 && r.height > 0 && el.children.length > 0) return el;\n }\n return null;\n}\n\n/**\n * Onboarding interativo próprio (sem dependência externa). O overlay/holofote e o\n * balão são renderizados pelo OnboardingOverlayComponent, que escuta este serviço.\n * Aparece uma vez por máquina (flag em localStorage), namespaced por cliente.\n */\n@Injectable({ providedIn: 'root' })\nexport class OnboardingService {\n private readonly text = inject(SPINE_MESSAGES).tour;\n /** Passo atual (null = tour inativo). O overlay component reage a isto. */\n public readonly current$ = new BehaviorSubject<{\n step: OnboardingStep;\n index: number;\n total: number;\n } | null>(null);\n\n private readonly stateSubject = new BehaviorSubject<OnboardingState>('idle');\n /** Fase do tour (ver `OnboardingState`). Emite o valor atual ao assinar. */\n public readonly state$: Observable<OnboardingState> = this.stateSubject.asObservable();\n /** Fase atual, síncrona. */\n get state(): OnboardingState { return this.stateSubject.value; }\n\n private readonly doneKey: string;\n private steps: OnboardingStep[] = [];\n private index = 0;\n private waiting: ReturnType<typeof setTimeout> | null = null;\n\n constructor(@Optional() @Inject(SPINE_CONFIG) config: SpineConfig | null) {\n const ns = config?.clientId ?? 'app';\n this.doneKey = `${ns}_onboarding_${ONBOARDING_VERSION}`;\n }\n\n private get done(): boolean {\n try { return localStorage.getItem(this.doneKey) === 'done'; } catch { return true; }\n }\n private markDone(): void {\n try { localStorage.setItem(this.doneKey, 'done'); } catch { /* sem localStorage → não insiste */ }\n }\n\n /**\n * Dispara o tour só se ainda não foi visto nesta máquina. Chamar após o login. Quando é devido, o\n * estado vira `pending` NA HORA (síncrono), antes da espera pelo shell — é isso que segura as\n * novidades; quando não é, continua `idle`. Chamar de novo com o tour já em andamento não faz nada.\n */\n maybeStart(): void {\n if (this.done || this.state !== 'idle') return;\n this.setState('pending');\n this.clearWaiting();\n this.waiting = setTimeout(() => this.start(), START_DELAY_MS);\n }\n\n /** Reabre o tour manualmente (menu Ajuda), ignorando a flag. Também passa por `pending` → `running`. */\n restart(): void {\n this.setState('pending');\n this.start();\n }\n\n /**\n * Interrompe o tour (pendente ou na tela) SEM marcar como visto: o automático volta na próxima entrada.\n * Usado quando a pessoa abre outra coisa que disputaria a tela com ele (as novidades pelo menu).\n */\n stop(): void {\n if (this.state === 'idle') return;\n this.clearWaiting();\n this.current$.next(null);\n this.setState('idle');\n }\n\n /** Passos no idioma ativo (o texto é lido do catálogo ao começar o tour). Descrições com `<b>`. */\n private allSteps(): OnboardingStep[] {\n const t = this.text;\n return [\n { title: t.welcomeTitle, description: t.welcomeText },\n { target: '[data-tour=\"apps\"]', title: t.appsTitle, description: t.appsText },\n { target: '[data-tour=\"search\"]', title: t.searchTitle, description: t.searchText },\n { target: '[data-tour=\"nav\"] .hm-sidebar__content', title: t.navModulesTitle, description: t.navModulesText },\n { target: '[data-tour=\"nav\"] .hm-sidebar__footer', title: t.navModeTitle, description: t.navModeText },\n { target: '[data-tour=\"tabs\"] hm-tab-bar', title: t.tabsTitle, description: t.tabsText },\n { target: '[data-tour=\"tabs\"]', title: t.splitTitle, description: t.splitText },\n { target: '[data-tour=\"breadcrumb\"]', title: t.whereTitle, description: t.whereText },\n { target: '[data-tour=\"theme\"]', title: t.themeTitle, description: t.themeText },\n { target: '[data-tour=\"density\"]', title: t.densityTitle, description: t.densityText },\n { target: '[data-tour=\"fullscreen\"]', title: t.fullscreenTitle, description: t.fullscreenText },\n { target: '[data-tour=\"profile\"]', title: t.profileTitle, description: t.profileText },\n { title: t.doneTitle, description: t.doneText },\n ];\n }\n\n /**\n * Começa do primeiro passo assim que todos os alvos estão na tela, ou no fim do prazo só com os passos\n * que têm alvo visível (e os sem alvo). Sem nenhum passo, só marca como visto. Não bloqueia: confere\n * de novo a cada `TARGET_POLL_MS`.\n */\n private start(): void {\n this.clearWaiting();\n const steps = this.allSteps();\n const present = (step: OnboardingStep) => !step.target || findTourTarget(step.target) !== null;\n\n const attempt = (waited: number): void => {\n if (!steps.every(present) && waited < TARGET_WAIT_MS) {\n this.waiting = setTimeout(() => attempt(waited + TARGET_POLL_MS), TARGET_POLL_MS);\n return;\n }\n this.waiting = null;\n this.steps = steps.filter(present);\n this.index = 0;\n if (!this.steps.length) {\n this.markDone();\n this.setState('idle');\n return;\n }\n this.emit();\n this.setState('running');\n };\n attempt(0);\n }\n\n private emit(): void {\n this.current$.next({ step: this.steps[this.index], index: this.index, total: this.steps.length });\n }\n\n private setState(state: OnboardingState): void {\n if (this.stateSubject.value !== state) this.stateSubject.next(state);\n }\n\n private clearWaiting(): void {\n if (this.waiting !== null) clearTimeout(this.waiting);\n this.waiting = null;\n }\n\n next(): void {\n if (this.index >= this.steps.length - 1) { this.finish(); return; }\n this.index++;\n this.emit();\n }\n\n prev(): void {\n if (this.index <= 0) return;\n this.index--;\n this.emit();\n }\n\n /** Encerra o tour (concluído ou pulado) e marca como visto. */\n finish(): void {\n this.clearWaiting();\n this.markDone();\n this.current$.next(null);\n this.setState('idle');\n }\n\n get isFirst(): boolean { return this.index === 0; }\n get isLast(): boolean { return this.index === this.steps.length - 1; }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SPINE_CONFIG, SPINE_NEWS, SpineNewsItem, SpineNewsSlide } from '@trismegisto/spine';\nimport { filter, take } from 'rxjs';\nimport { OnboardingService } from '../onboarding/onboarding.service';\n\n/** Intervalo entre o fim do tour (ou a entrada, sem tour) e o painel de novidades, para os dois não se\n * emendarem na tela. */\nconst AFTER_TOUR_MS = 800;\n\n/**\n * Painel de novidades do app (ver `provideSpineNews`). Decide o que está devido — ainda não visto\n * NESTE navegador e ainda dentro do `until` — e abre sozinho uma vez, depois do tour de boas-vindas.\n * O \"já visto\" é por app (`hermes_<clientId>_news_seen`): novidade de um app não some por ter sido\n * vista em outro no mesmo domínio.\n *\n * Tour e novidades nunca dividem a tela: na entrada, as novidades esperam o tour ficar `idle` (ver\n * `OnboardingState`); fora dela, vale a última ação explícita da pessoa — o tour reaberto pelo menu\n * Ajuda fecha o painel de novidades, e as novidades abertas pelo menu interrompem o tour (sem marcá-lo\n * como visto).\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineNewsService {\n private readonly onboarding = inject(OnboardingService);\n private readonly items: readonly SpineNewsItem[] = (inject(SPINE_NEWS, { optional: true }) ?? []).flat();\n private readonly seenKey: string;\n\n /** Slides em exibição (os devidos, ou todos os vigentes quando reaberto pelo menu). */\n readonly slides = signal<readonly SpineNewsSlide[]>([]);\n readonly isOpen = signal(false);\n /** Há alguma novidade vigente — o item \"Novidades\" do menu só aparece com isto. */\n readonly hasAny = computed(() => this.current().length > 0);\n\n constructor() {\n const ns = inject(SPINE_CONFIG, { optional: true })?.clientId;\n this.seenKey = `${ns ? `hermes_${ns}` : 'hermes'}_news_seen`;\n\n // O tour (re)começando — inclusive pelo menu Ajuda — fecha o painel: ele é a ação mais recente.\n this.onboarding.state$\n .pipe(filter((state) => state === 'pending'), takeUntilDestroyed())\n .subscribe(() => this.close());\n }\n\n /**\n * Chamado uma vez pelo layout na entrada: abre as devidas quando o tour estiver `idle` (não devido,\n * concluído, pulado ou sem passo), mais `AFTER_TOUR_MS` para não emendar. Se o tour começar nesse\n * intervalo, volta a esperar — por isso a ordem com `OnboardingService.maybeStart()` não importa,\n * desde que ele seja chamado dentro desse intervalo (o layout chama os dois juntos, tour primeiro).\n */\n scheduleOnEntry(): void {\n if (this.due().length === 0) return;\n const whenIdle = (): void => {\n this.onboarding.state$.pipe(filter((state) => state === 'idle'), take(1)).subscribe(() => {\n setTimeout(() => {\n if (this.onboarding.state !== 'idle') whenIdle();\n else this.showDue();\n }, AFTER_TOUR_MS);\n });\n };\n whenIdle();\n }\n\n /** Marca como vistas todas as novidades devidas e as abre num único painel. */\n showDue(): void {\n const due = this.due();\n if (due.length === 0) return;\n this.markSeen(due.map((i) => i.id));\n this.open(due);\n }\n\n /**\n * Reabre todas as vigentes (menu do perfil), vistas ou não; as devidas entre elas passam a vistas.\n * Interrompe o tour se ele estiver pendente ou na tela (ação mais recente da pessoa).\n */\n showAll(): void {\n const all = this.current();\n if (all.length === 0) return;\n this.onboarding.stop();\n const due = this.due();\n if (due.length) this.markSeen(due.map((i) => i.id));\n this.open(all);\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n private open(items: readonly SpineNewsItem[]): void {\n const slides = items.flatMap((i) => i.slides);\n if (slides.length === 0) return;\n this.slides.set(slides);\n this.isOpen.set(true);\n }\n\n /** Vigentes: sem `until`, ou com `until` ainda não passado (comparação por data, AAAA-MM-DD). */\n private current(): readonly SpineNewsItem[] {\n const today = new Date().toISOString().slice(0, 10);\n return this.items.filter((i) => !i.until || today <= i.until);\n }\n\n private due(): readonly SpineNewsItem[] {\n const seen = this.readSeen();\n return this.current().filter((i) => !seen.has(i.id));\n }\n\n private readSeen(): Set<string> {\n try {\n return new Set(JSON.parse(localStorage.getItem(this.seenKey) || '[]') as string[]);\n } catch {\n return new Set();\n }\n }\n\n private markSeen(ids: readonly string[]): void {\n try {\n const seen = this.readSeen();\n ids.forEach((id) => seen.add(id));\n localStorage.setItem(this.seenKey, JSON.stringify([...seen]));\n } catch {\n /* sem localStorage: mostra de novo na próxima entrada, sem quebrar nada */\n }\n }\n}\n","import { DestroyRef, Injectable, inject, signal } from '@angular/core';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { SPINE_MESSAGES, SpineUserStorage } from '@trismegisto/spine';\nimport { AlertType, NotificationService } from '@trismegisto/spine/notification';\n\n/** Tempo do aviso de falha na tela (segundos). */\nconst LOGOUT_FAILED_SECONDS = 8;\n\n/** O que o spine usa do `AuthorizationService`, nas duas linhas do `@orfeu/angular`: na 1.0.x `logout()` não\n * devolve nada e não existe `logoutFailed$`; da 1.3.0 em diante devolve `Promise<boolean>` e há `logoutFailed$`. */\ninterface LogoutCapable {\n logout(): unknown;\n logoutFailed$?: { subscribe(next: () => void): { unsubscribe(): void } };\n}\n\n/**\n * Saída da sessão pelo shell: todo botão/atalho de sair do spine passa por aqui (menu do perfil, painel de\n * configurações, `Mod+Shift+L`, tela `/blocked`).\n *\n * - Assina `logoutFailed$` do `@orfeu/angular` (1.3.x) uma vez só: quando o logout no Argos falha (a lib repete uma\n * vez e mantém a sessão), mostra o aviso de erro `session.logoutFailed` (`hm-alert` de erro, `role=\"alert\"`). Vale\n * também para um `logout()` chamado direto pelo app.\n * - `logout()` aguarda o resultado: só apaga os históricos do usuário (`SpineUserStorage.clearHistory()`) quando a\n * saída deu certo. Com falha, nada muda: a pessoa continua na tela, com a sessão e os recentes.\n * - `pending` fica `true` enquanto a saída está em andamento e sempre volta a `false` (os botões não travam).\n *\n * Com `@orfeu/angular` 1.0.x (sem `logoutFailed$`, `logout()` sem retorno) a saída conta como concluída, como antes.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineLogoutService {\n private readonly auth = inject(AuthorizationService) as unknown as LogoutCapable;\n private readonly userStorage = inject(SpineUserStorage);\n private readonly notifications = inject(NotificationService);\n private readonly messages = inject(SPINE_MESSAGES);\n /** `true` quando a lib avisa a falha por `logoutFailed$` (então o aviso sai por lá, uma vez). */\n private readonly failureStream: boolean;\n private inFlight: Promise<boolean> | null = null;\n\n /** Saída em andamento (o botão mostra \"saindo…\" / fica desabilitado). */\n readonly pending = signal(false);\n\n constructor() {\n const failed$ = this.auth.logoutFailed$;\n this.failureStream = typeof failed$?.subscribe === 'function';\n if (!this.failureStream) return;\n const sub = failed$!.subscribe(() => this.notifyFailure());\n inject(DestroyRef).onDestroy(() => sub.unsubscribe());\n }\n\n /**\n * Sai da sessão. Resolve `true` quando saiu (o `@orfeu/angular` já navega para o `/logoff`) e `false` quando o\n * Argos não confirmou: a sessão continua e o aviso de erro aparece. Nunca rejeita. Cliques repetidos durante a\n * saída reaproveitam a mesma tentativa.\n */\n logout(): Promise<boolean> {\n this.inFlight ??= this.run().finally(() => {\n this.inFlight = null;\n this.pending.set(false);\n });\n return this.inFlight;\n }\n\n private async run(): Promise<boolean> {\n this.pending.set(true);\n // Guarda de quem é a sessão antes de sair: depois do logout o token some, e a limpeza precisa do usuário.\n this.userStorage.userId();\n let ok: boolean;\n let rejected = false;\n try {\n // 1.3.x: Promise<boolean>; 1.0.x: void (a saída local sempre acontecia).\n ok = (await this.auth.logout()) !== false;\n } catch {\n ok = false;\n rejected = true;\n }\n if (ok) {\n this.userStorage.clearHistory();\n } else if (rejected || !this.failureStream) {\n // Sem `logoutFailed$` para avisar (ou a chamada nem chegou a resolver): o próprio resultado avisa.\n this.notifyFailure();\n }\n return ok;\n }\n\n private notifyFailure(): void {\n this.notifications.addNotification({\n timer: LOGOUT_FAILED_SECONDS,\n hermesAlertType: AlertType.DANGER,\n message: this.messages.session.logoutFailed,\n hermesAlertClosable: true,\n });\n }\n}\n","import { InjectionToken, Injectable, Provider, Type, signal } from '@angular/core';\n\n/** Seções que o próprio spine já traz. `key` é também o valor de `?settings=` na URL. */\nexport const SPINE_SETTINGS_KEYS = {\n appearance: 'aparencia',\n region: 'regiao',\n shortcuts: 'atalhos',\n account: 'conta',\n security: 'seguranca',\n about: 'sobre',\n} as const;\n\n/** Seção extra do painel, registrada pelo app (ex.: preferências de deploy do hefesto). */\nexport interface SpineSettingsSection {\n /** Identificador estável; também o que `?settings=<key>` abre. Não repetir os do spine. */\n key: string;\n label: string;\n /** Ícone do hermes-icon na navegação. */\n icon?: string;\n description?: string;\n /** Termos extras que acham a seção inteira na busca. */\n keywords?: string;\n /** Conteúdo da seção — de preferência `hm-settings-row`s, para a busca achar cada linha. */\n component: Type<unknown>;\n}\n\nexport const SPINE_SETTINGS_SECTIONS = new InjectionToken<SpineSettingsSection[]>('SPINE_SETTINGS_SECTIONS');\n\n/** Registra uma seção do app no painel de configurações (aparece depois das do spine, antes de\n * \"Sobre\"). Pode ser chamado várias vezes, uma por seção. */\nexport function provideSettingsSection(section: SpineSettingsSection): Provider {\n return { provide: SPINE_SETTINGS_SECTIONS, useValue: section, multi: true };\n}\n\n/** Abre/fecha o painel de configurações de qualquer lugar (menu do perfil, atalho, link). */\n@Injectable({ providedIn: 'root' })\nexport class SpineSettingsService {\n readonly isOpen = signal(false);\n /** Seção pedida na abertura (vazio = a primeira). */\n readonly section = signal('');\n\n open(section = ''): void {\n this.section.set(section);\n this.isOpen.set(true);\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n toggle(): void {\n if (this.isOpen()) this.close();\n else this.open();\n }\n}\n","import { Injectable, OnDestroy, computed, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { HERMES_MESSAGES, HermesShortcut, HermesShortcutItem, HermesShortcutService } from '@trismegisto/angular';\nimport { SPINE_MESSAGES, SPINE_USER_STORAGE_KEYS, SpineUserStorage } from '@trismegisto/spine';\n\n/** Grupo do painel de atalhos. Id estável; o nome exibido vem do catálogo da lib (`shortcuts.groups`). */\nexport type ShortcutGroupId = 'navigation' | 'actions' | 'general';\n\n/** Item exibido no painel de atalhos (cheatsheet, aberto com \"?\"). */\nexport interface ShortcutItem {\n /** Teclas já em texto, na plataforma atual (`'Ctrl + K'`, `'⌘K'`, `'G depois H'`). */\n keys: string;\n description: string;\n group: ShortcutGroupId;\n}\n\n/** Atalhos agrupados, já com o nome do grupo no idioma ativo. */\nexport interface ShortcutGroup {\n id: ShortcutGroupId;\n name: string;\n items: ShortcutItem[];\n}\n\n/** Ações concretas que o atalho dispara — ligadas pelo LayoutComponent. */\nexport interface ShortcutActions {\n navigate?: (url: string) => void; // navega para uma rota (ex.: '/home', favorito)\n toggleTheme?: () => void; // alterna claro/escuro\n toggleFullscreen?: () => void; // tela cheia\n logout?: () => void; // sair\n openSettings?: () => void; // painel de configurações\n}\n\n/** `G 1` … `G 9`: um registro só (o dígito sai do evento); a referência identifica o item no painel. */\nconst FAVORITE_KEYS: readonly string[] = Array.from({ length: 9 }, (_, i) => `G ${i + 1}`);\n/** Como os favoritos aparecem no painel: uma linha \"G depois 1…9\" em vez de nove alternativas. */\nconst FAVORITE_DISPLAY_KEYS = 'G 1…9';\n\n/**\n * Atalhos de teclado globais do sistema, sobre o `HermesShortcutService` da lib (um listener só,\n * sequência `G H`, conflito, campo editável, interruptor de tecla única da WCAG 2.1.4).\n *\n * `setActions` registra os atalhos do shell: `G H` (Home), `G 1`…`G 9` (favoritos), `Mod+,`\n * (configurações), `Mod+.` (tema), `Mod+Shift+F` (tela cheia), `Mod+Shift+L` (sair) e `?` (painel\n * de atalhos, via `help$`). Os combos com `Mod` valem também com o foco num campo; `G …` e `?`, não.\n *\n * O painel (`spine-shortcuts-cheatsheet` e a seção Atalhos das configurações) usa o\n * `hm-shortcut-list` com `panelItems()`: tudo o que está registrado no `HermesShortcutService`\n * (inclusive o que o app liga com `[hmShortcut]`) mais o que o spine só exibe e outra peça dispara\n * (`Mod+K` do `hm-header`, `Alt+←/→` do navegador, `Esc` dos diálogos).\n */\n@Injectable({ providedIn: 'root' })\nexport class ShortcutService implements OnDestroy {\n private actions: ShortcutActions = {};\n private removers: (() => void)[] = [];\n private readonly userStorage = inject(SpineUserStorage);\n private readonly hermes = inject(HermesShortcutService);\n private readonly lib = inject(HERMES_MESSAGES);\n private readonly text = inject(SPINE_MESSAGES).shortcuts;\n\n /** Emite quando o usuário pede o painel de atalhos (tecla \"?\" ou menu do perfil). */\n public readonly help$ = new Subject<void>();\n\n /** Teclas (referência) → descrição viva, para o painel acompanhar a troca de idioma. */\n private readonly own = new Map<string | readonly string[], () => string>();\n\n /** Os atalhos do shell. `describe` lê o catálogo na hora (o idioma pode mudar depois do registro). */\n private definitions(): (Omit<HermesShortcut, 'description'> & { describe: () => string })[] {\n const t = this.text;\n return [\n { keys: ['G H'], describe: () => t.goHome, group: 'navigation', handler: () => this.navigate('/home') },\n { keys: FAVORITE_KEYS, describe: () => t.goFavorite, group: 'navigation', handler: (e) => this.goToFavorite(e) },\n { keys: ['Mod+,'], describe: () => t.openSettings, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.openSettings) },\n { keys: ['Mod+.'], describe: () => t.toggleTheme, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.toggleTheme) },\n { keys: ['Mod+Shift+F'], describe: () => t.fullscreen, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.toggleFullscreen) },\n { keys: ['Mod+Shift+L'], describe: () => t.logout, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.logout) },\n { keys: ['?'], describe: () => t.showHelp, group: 'general', handler: () => this.help$.next() },\n ];\n }\n\n /** Só exibidos: quem dispara é outra peça (hm-header, navegador, diálogos). */\n private displayOnly(): HermesShortcutItem[] {\n const t = this.text;\n return [\n { keys: 'Mod+K', description: t.openSearch, group: 'navigation' },\n { keys: ['Alt+Left', 'Alt+Right'], description: t.history, group: 'navigation' },\n { keys: 'Esc', description: t.closeOverlay, group: 'general' },\n ];\n }\n\n /**\n * O que o painel lista (`<hm-shortcut-list [registered]=\"false\" [items]=\"panelItems()\">`): os\n * atalhos registrados no `HermesShortcutService`, com os favoritos numa linha só, e os só exibidos.\n * Acompanha registro/remoção e a troca de idioma do catálogo da lib.\n */\n public readonly panelItems = computed<readonly HermesShortcutItem[]>(() => {\n const registered = this.hermes.list().map((item) => {\n const describe = this.own.get(item.keys);\n if (!describe) return item;\n return { ...item, description: describe(), keys: item.keys === FAVORITE_KEYS ? FAVORITE_DISPLAY_KEYS : item.keys };\n });\n const display = this.displayOnly();\n // Ordem do painel antigo: busca e histórico abrem a navegação, Esc fecha o geral.\n return [display[0], ...registered, display[1], display[2]];\n });\n\n /**\n * Lista do painel em texto, no idioma e na plataforma atuais.\n * @deprecated Use o `hm-shortcut-list` com `panelItems()` (ou `HermesShortcutService.list()`).\n * Mantido para quem montava o próprio painel; sai numa próxima versão.\n */\n public get shortcuts(): ShortcutItem[] {\n return this.panelItems().map((item) => ({\n keys: this.keysText(item.keys),\n description: item.description,\n group: toSpineGroup(item.group),\n }));\n }\n\n /**\n * Atalhos por grupo, na ordem navegação → ações → geral, com o nome do grupo traduzido.\n * @deprecated Use o `hm-shortcut-list` (agrupa, traduz e desenha as teclas). Sai numa próxima versão.\n */\n public groups(): ShortcutGroup[] {\n const all = this.shortcuts;\n return (['navigation', 'actions', 'general'] as const)\n .map((id) => ({ id, name: this.hermes.groupName(id), items: all.filter((s) => s.group === id) }))\n .filter((g) => g.items.length);\n }\n\n /** Liga as ações e registra os atalhos no `HermesShortcutService` (idempotente: chamadas seguintes só trocam as ações). */\n setActions(actions: ShortcutActions): void {\n this.actions = { ...this.actions, ...actions };\n if (this.removers.length) return;\n this.removers = this.definitions().map(({ describe, ...definition }) => {\n // Teclas sempre em lista própria: a referência identifica o registro do spine no painel.\n this.own.set(definition.keys, describe);\n const remove = this.hermes.register({ ...definition, description: describe() });\n return () => {\n remove();\n this.own.delete(definition.keys);\n };\n });\n }\n\n ngOnDestroy(): void {\n this.removers.forEach((remove) => remove());\n this.removers = [];\n }\n\n // ── interno ────────────────────────────────────────────────────────────────\n\n /** Ação ausente devolve `false`: o evento segue sem `preventDefault` (o navegador faz o dele). */\n private call(fn?: () => void): boolean {\n if (!fn) return false;\n fn();\n return true;\n }\n\n private navigate(url: string): boolean {\n return this.call(this.actions.navigate && (() => this.actions.navigate!(url)));\n }\n\n /** Navega para o N-ésimo favorito (1-based) lido da store da navegação; N = o dígito do evento. */\n private goToFavorite(event: KeyboardEvent): boolean {\n const digit = /^[1-9]$/.test(event.key) ? event.key : /^Digit([1-9])$/.exec(event.code)?.[1];\n if (!digit) return false;\n let url: string | null = null;\n try {\n const list = JSON.parse(localStorage.getItem(this.userStorage.key(SPINE_USER_STORAGE_KEYS.favorites)) || '[]');\n const fav = Array.isArray(list) ? list[Number(digit) - 1] : null;\n url = fav?.redirect || (typeof fav?.id === 'string' && fav.id.startsWith('/') ? fav.id : null);\n } catch { /* store inválida → ignora */ }\n return url ? this.navigate(url) : false;\n }\n\n /** Texto corrido das teclas para a API antiga (`shortcuts`): \"Ctrl + K\", \"G depois H\", \"… ou …\". */\n private keysText(keys: string | readonly string[]): string {\n const { then, or } = this.lib.shortcuts;\n const join = this.hermes.platform === 'mac' ? '' : ' + ';\n return this.hermes\n .format(keys)\n .map((steps) => steps.map((step) => step.map((key) => key.label).join(join)).join(` ${then} `))\n .join(` ${or} `);\n }\n}\n\nfunction toSpineGroup(group: string | undefined): ShortcutGroupId {\n return group === 'navigation' || group === 'actions' ? group : 'general';\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, Injector, OnInit, Optional, Inject, Type, ViewChild, afterNextRender, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { filter, take } from 'rxjs';\nimport { AuthorizationService, UserProfile, ViewService } from '@orfeu/angular/core';\nimport {\n AccountAvatarComponent,\n HeaderComponent as HermesHeaderComponent,\n IconButtonComponent,\n IconComponent,\n InputComponent,\n MenuButtonComponent,\n MenuItem,\n ModalComponent,\n} from '@trismegisto/angular';\nimport { DensityService, Route, SPINE_CONFIG, SPINE_USER_STORAGE_KEYS, SpineConfig, SpineUserStorage, ThemePresetService, ThemeService, SPINE_MESSAGES, spineRoutesOf } from '@trismegisto/spine';\nimport { AppLauncherComponent } from './app-launcher.component';\nimport { SpineBrandComponent } from './brand.component';\nimport { OnboardingService } from '../onboarding/onboarding.service';\nimport { SpineNewsService } from '../news/news.service';\nimport { ShortcutService } from '../shortcuts/shortcut.service';\nimport { SpineLogoutService } from '../logout/logout.service';\nimport { SpineSettingsService, SPINE_SETTINGS_KEYS } from '../settings/settings.service';\nimport { formatMessage } from '@trismegisto/primitives';\n\n/** Item achatado da árvore de rotas, usado pela busca global (quick-launcher). */\ninterface QuickItem { name: string; icon: string; redirect: string; path: string; }\n\nconst MAX_RECENT_SEARCH = 6;\n\n@Component({\n selector: 'spine-header',\n imports: [\n CommonModule, FormsModule,\n HermesHeaderComponent, IconButtonComponent, IconComponent, InputComponent, MenuButtonComponent, AccountAvatarComponent, ModalComponent,\n AppLauncherComponent, SpineBrandComponent,\n ],\n templateUrl: './header.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './header.component.scss',\n})\nexport class HeaderComponent implements OnInit {\n\n public isFullscreen = !!document.fullscreenElement;\n public element = document.documentElement;\n public headerBlocked = false;\n /** route_redirect da primeira rota navegável da view atual — usado pela marca do header.\n * null quando a view não tem nenhuma rota (nesse caso a marca não é link). */\n public homeRoute: string | null = null;\n /** Nome do app (SpineConfig.appName; padrão \"Hermes\") — quem desenha é o `spine-brand`. */\n protected readonly appName: string;\n\n private readonly injector = inject(Injector);\n protected readonly text = inject(SPINE_MESSAGES).header;\n protected readonly fmt = formatMessage;\n private readonly settings = inject(SpineSettingsService);\n private readonly news = inject(SpineNewsService);\n private readonly userStorage = inject(SpineUserStorage);\n private readonly logoutService = inject(SpineLogoutService);\n /** Por usuário (`SpineUserStorage`): `<clientId>_header_recent_searches_<sub>`; apagada no logout. */\n private get recentSearchKey(): string {\n return this.userStorage.key(SPINE_USER_STORAGE_KEYS.recentSearches);\n }\n\n constructor(\n private authService: AuthorizationService,\n protected themeService: ThemeService,\n protected themePresetService: ThemePresetService,\n protected densityService: DensityService,\n private viewService: ViewService,\n private router: Router,\n private onboarding: OnboardingService,\n private shortcuts: ShortcutService,\n @Optional() @Inject(SPINE_CONFIG) config: SpineConfig | null,\n ) {\n this.appName = config?.appName ?? 'Hermes';\n }\n\n async ngOnInit(): Promise<void> {\n this.updateView(this.viewService.currentView);\n this.viewService.currentView$.subscribe((data: any) => this.updateView(data));\n\n // Depois de trocar de badge, a view/rotas mudam — sem isso o usuário fica\n // parado numa rota que pode não existir mais pro badge novo. Se o badge novo\n // não tiver nenhuma view disponível, manda pro no-permission em vez de travar.\n //\n // badgeChanged$ dispara ANTES do ViewService.currentView ser atualizado\n // (AuthorizationService.switchBadge emite o evento em applyToken() e só\n // depois faz `await view.update(token)`), então não dá pra usar\n // currentView na hora do evento — ele ainda é a view do badge anterior.\n // Por isso esperamos a próxima emissão *diferente* de currentView$ antes\n // de decidir o redirect.\n this.authService.badgeChanged$.subscribe(() => {\n const staleView = this.viewService.currentView;\n this.viewService.currentView$\n .pipe(filter((v: any) => v !== staleView), take(1))\n .subscribe((data: any) => {\n const firstRoute = this.findFirstNavigable(spineRoutesOf(data));\n this.router.navigate([firstRoute ?? '/no-permission']);\n });\n });\n\n this.recentSearches = this.loadRecent();\n }\n\n updateView(data: any) {\n const routes = spineRoutesOf(data);\n this.quickIndex = this.flattenRoutes(routes, []);\n this.homeRoute = this.findFirstNavigable(routes);\n }\n\n /** Primeira rota navegável (DFS), atravessando grupos \"transparentes\" sem route_redirect. */\n private findFirstNavigable(routes: Route[]): string | null {\n for (const r of routes || []) {\n if (!r) continue;\n if (r.route_redirect) return r.route_redirect;\n if (r.routes?.length) {\n const found = this.findFirstNavigable(r.routes as Route[]);\n if (found) return found;\n }\n }\n return null;\n }\n\n setTheme(theme: 'light' | 'dark') {\n this.themeService.setTheme(theme);\n }\n\n setDensity() { this.densityService.toggleDensity(); }\n get isCompactDensity(): boolean { return this.densityService.current.name === 'compact'; }\n\n toggleFullscreen() {\n if (!document.fullscreenElement) {\n this.element.requestFullscreen()\n .then(() => { this.isFullscreen = true; })\n .catch(err => console.error(`Erro ao ativar tela cheia: ${err.message}`));\n } else {\n document.exitFullscreen()\n .then(() => { this.isFullscreen = false; })\n .catch(err => console.error(`Erro ao sair da tela cheia: ${err.message}`));\n }\n }\n\n get badge() { return this.authService.badge; }\n get badges() { return this.authService.badges; }\n get profile(): UserProfile { return this.authService.profile; }\n\n async switchBadge(badgeTypeId: string): Promise<void> {\n await this.authService.switchBadge(badgeTypeId);\n }\n\n /** Sai pelo `SpineLogoutService`: com falha no Argos a pessoa fica aqui, com aviso, e o histórico fica. */\n logout(): Promise<boolean> {\n return this.logoutService.logout();\n }\n\n /** Reabre o tour guiado de onboarding. */\n startTour() { this.onboarding.restart(); }\n\n /** Abre o painel de atalhos de teclado. */\n openShortcuts() { this.shortcuts.help$.next(); }\n\n /** Menu do perfil: achatado (badges, se houver mais de um, + ações), já que `hm-menu`\n * não tem submenu aninhado como o `hermes-dropdown` antigo tinha para a troca de crachá. */\n get profileMenuItems(): MenuItem[] {\n const items: MenuItem[] = [];\n // Vários níveis de acesso: um item que abre um segundo menu (MenuItem.children) em vez de listar\n // todos os níveis direto no menu do perfil.\n if (this.badges.length > 1) {\n items.push({\n id: 'badges',\n label: this.text.accessLevels,\n icon: 'shield-check',\n children: this.badges.map(b => ({ id: `badge:${b.id}`, label: b.name, icon: 'shield-check', disabled: b.id === this.badge?.id })),\n });\n }\n items.push({ id: 'settings', label: this.text.settings, icon: 'cog', separatorAbove: items.length > 0 });\n items.push({ id: 'theme', label: this.text.appearance, icon: 'color-palette' });\n items.push({ id: 'shortcuts', label: this.text.shortcuts, icon: 'keyboard' });\n items.push({ id: 'tour', label: this.text.tour, icon: 'play' });\n // Só quando o app registrou alguma novidade vigente (provideSpineNews).\n if (this.news.hasAny()) items.push({ id: 'news', label: this.text.news, icon: 'star' });\n // Desabilitado só enquanto a saída está em andamento; volta sozinho se ela falhar.\n items.push({ id: 'logout', label: this.text.logout, icon: 'logout', danger: true, separatorAbove: true, disabled: this.logoutService.pending() });\n return items;\n }\n\n onProfileMenuChosen(id: string): void {\n if (id.startsWith('badge:')) { void this.switchBadge(id.slice('badge:'.length)); return; }\n switch (id) {\n case 'tour': this.startTour(); return;\n case 'news': this.news.showAll(); return;\n case 'shortcuts': this.openShortcuts(); return;\n case 'settings': this.settings.open(); return;\n // \"Aparência\" abre o painel direto na seção (era o modal de tema, que virou parte dela).\n case 'theme': this.settings.open(SPINE_SETTINGS_KEYS.appearance); return;\n case 'logout': void this.logout(); return;\n }\n }\n\n // ─── Busca global (quick-launcher) ──────────────────────────────────────────\n @ViewChild('quickBox') quickBox?: ElementRef<HTMLElement>;\n public quickQuery = '';\n public quickOpen = false;\n public quickResults: QuickItem[] = [];\n public quickActive = 0;\n private quickIndex: QuickItem[] = [];\n /** Histórico de buscas (mostrado ao focar com o campo vazio). */\n public recentSearches: QuickItem[] = [];\n /** Verdadeiro quando o painel está exibindo o histórico (campo vazio). */\n public showingRecent = false;\n\n /** Achata a árvore de rotas em itens navegáveis (com trilha de ancestrais). */\n private flattenRoutes(routes: Route[], trail: string[]): QuickItem[] {\n const skip = new Set(['search', 'theme', 'logout']);\n const out: QuickItem[] = [];\n for (const r of routes || []) {\n if (!r) continue;\n const name = r.route_display_name || '';\n if (r.route_redirect && name && !skip.has(r.route_type as string)) {\n out.push({ name, icon: r.route_icon || 'application', redirect: r.route_redirect, path: trail.join(' › ') });\n }\n if (r.routes?.length) out.push(...this.flattenRoutes(r.routes as Route[], name ? [...trail, name] : trail));\n }\n return out;\n }\n\n /** Chamado pelo `(searchRequested)` do `hm-header` (clique no campo ou `Ctrl K`, já tratado\n * internamente por ele) — abre o modal de busca, mesmo padrão do `docs/website`\n * (`openSearch()` em `app.component.ts`: `@if` monta o `hm-modal` só quando aberto). */\n onSearchRequested(): void {\n this.quickQuery = '';\n this.quickOpen = true;\n this.onQuickSearch();\n // O `#quickBox` (e o input do hm-input dentro dele) só existe no DOM depois do `@if`/`hm-modal` montarem — foca assim que\n // a próxima renderização terminar (mesmo problema documentado em WorkspaceNavService: query\n // de view não existe antes do primeiro ciclo depois do `@if` virar true).\n afterNextRender(() => this.quickBox?.nativeElement?.querySelector('input')?.focus(), { injector: this.injector });\n }\n\n /** `(openChange)` do `hm-modal` — fecha ao clicar fora/Esc/botão de fechar. */\n onQuickModalOpenChange(open: boolean): void {\n this.quickOpen = open;\n if (!open) {\n this.quickQuery = '';\n this.quickResults = [];\n this.showingRecent = false;\n }\n }\n\n onQuickSearch() {\n const q = (this.quickQuery || '').trim().toLowerCase();\n this.quickActive = 0;\n // Campo vazio: mostra o histórico (recalculado na hora, para refletir as\n // últimas navegações) em vez de nada.\n if (!q) {\n this.showingRecent = true;\n this.recentSearches = this.loadRecent();\n this.quickResults = this.recentSearches.slice(0, 8);\n return;\n }\n this.showingRecent = false;\n const seen = new Set<string>();\n this.quickResults = this.quickIndex\n .filter((x) => (x.name.toLowerCase().includes(q) || x.path.toLowerCase().includes(q)))\n .filter((x) => (seen.has(x.redirect) ? false : (seen.add(x.redirect), true)))\n .slice(0, 8);\n }\n\n quickGo(item: QuickItem) {\n if (!item?.redirect) return;\n this.pushRecent(item);\n this.onQuickModalOpenChange(false);\n this.router.navigateByUrl(item.redirect);\n }\n\n quickMove(delta: number) {\n if (!this.quickResults.length) return;\n this.quickActive = (this.quickActive + delta + this.quickResults.length) % this.quickResults.length;\n }\n\n // ─── Histórico de buscas ────────────────────────────────────────────────────\n private readJson(key: string): any[] {\n try { const v = JSON.parse(localStorage.getItem(key) || '[]'); return Array.isArray(v) ? v : []; }\n catch { return []; }\n }\n\n private loadRecent(): QuickItem[] {\n return this.readJson(this.recentSearchKey)\n .filter((x) => x?.redirect && x?.name)\n .map((x) => ({ name: x.name, icon: x.icon || 'application', redirect: x.redirect, path: x.path || '' }))\n .slice(0, MAX_RECENT_SEARCH);\n }\n private pushRecent(item: QuickItem) {\n const entry: QuickItem = { name: item.name, icon: item.icon || 'application', redirect: item.redirect, path: item.path || '' };\n const next = [entry, ...this.recentSearches.filter((x) => x.redirect !== entry.redirect)].slice(0, MAX_RECENT_SEARCH);\n this.recentSearches = next;\n try { localStorage.setItem(this.recentSearchKey, JSON.stringify(next)); } catch { /* storage cheio/indisponível */ }\n }\n clearRecent(event?: Event) {\n event?.preventDefault();\n event?.stopPropagation();\n this.recentSearches = [];\n try { localStorage.removeItem(this.recentSearchKey); } catch { /* noop */ }\n this.quickResults = [];\n }\n}\n","<hm-header [class.header-blocked]=\"headerBlocked\" (searchRequested)=\"onSearchRequested()\">\n <div *ngIf=\"headerBlocked\" class=\"header-overlay\"></div>\n\n <spine-app-launcher></spine-app-launcher>\n\n <!-- Marca: logo do app (SpineConfig.logo, padrão assets/images/logo.svg) + SpineConfig.appName,\n levando à primeira rota navegável. Ver SpineBrandComponent. -->\n <spine-brand [homeRoute]=\"homeRoute\" [label]=\"text.home\" />\n\n <div actions class=\"h-right\">\n <!-- tema claro/escuro -->\n <hm-icon-button emphasis=\"subtle\" data-tour=\"theme\" (clicked)=\"setTheme(themeService.current == 'light' ? 'dark' : 'light')\"\n [icon]=\"themeService.current == 'light' ? 'moon' : 'sun'\"\n [label]=\"themeService.current == 'light' ? text.themeDark : text.themeLight\">\n </hm-icon-button>\n\n <!-- densidade -->\n <hm-icon-button emphasis=\"subtle\" data-tour=\"density\" (clicked)=\"setDensity()\"\n [icon]=\"isCompactDensity ? 'density-comfortable' : 'density-compact'\"\n [label]=\"isCompactDensity ? text.densityComfortable : text.densityCompact\">\n </hm-icon-button>\n\n <!-- tela cheia -->\n <hm-icon-button emphasis=\"subtle\" data-tour=\"fullscreen\" (clicked)=\"toggleFullscreen()\"\n [icon]=\"isFullscreen ? 'shrink' : 'resize'\"\n [label]=\"isFullscreen ? text.exitFullscreen : text.fullscreen\">\n </hm-icon-button>\n\n <span class=\"h-divider\" aria-hidden=\"true\"></span>\n\n <!-- perfil: crachá, ajuda, tema e sair ficam dentro do menu -->\n <hm-menu-button class=\"h-profile\" data-tour=\"profile\" [label]=\"profile.name ?? text.user\" align=\"end\" [items]=\"profileMenuItems\" (chosen)=\"onProfileMenuChosen($event)\">\n <hm-account-avatar [name]=\"profile.name ?? text.user\" [imageUrl]=\"profile.picture\"></hm-account-avatar>\n <span class=\"h-profile-info\">\n <span class=\"h-profile-name\">{{ profile.name ?? text.user }}</span>\n <span class=\"h-profile-role\" *ngIf=\"badge\">{{ badge?.name }}</span>\n </span>\n </hm-menu-button>\n </div>\n</hm-header>\n\n<!-- Busca global (quick-launcher) — mesmo padrão do docs/website: modal aberto por\n (searchRequested), não um overlay próprio sempre presente no DOM. -->\n@if (quickOpen) {\n <hm-modal [open]=\"quickOpen\" (openChange)=\"onQuickModalOpenChange($event)\" [heading]=\"text.search\" size=\"medium\">\n <!-- Mesmo padrão da busca do design system: hm-input + lista simples (nome · onde). Setas/Enter navegam. -->\n <div class=\"search\" data-tour=\"search\" #quickBox\n (keydown.arrowdown)=\"$event.preventDefault(); quickMove(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); quickMove(-1)\"\n (keydown.enter)=\"quickGo(quickResults[quickActive])\">\n <hm-input [label]=\"text.search\" [placeholder]=\"text.searchPlaceholder\" icon=\"search\"\n [(ngModel)]=\"quickQuery\" (ngModelChange)=\"onQuickSearch()\" />\n\n @if (showingRecent && quickResults.length) {\n <div class=\"search__recent\">\n <span>{{ text.recentSearches }}</span>\n <button type=\"button\" (mousedown)=\"clearRecent($event)\">{{ text.clearRecent }}</button>\n </div>\n }\n @if (quickResults.length) {\n <ul class=\"search__results\">\n @for (r of quickResults; track $index; let i = $index) {\n <li>\n <button type=\"button\" [class.active]=\"i === quickActive\" (mouseenter)=\"quickActive = i\" (mousedown)=\"quickGo(r)\">\n <strong><hm-icon [shape]=\"showingRecent ? 'history' : r.icon\" />{{ r.name }}</strong>\n @if (r.path) { <span>{{ r.path }}</span> }\n </button>\n </li>\n }\n </ul>\n } @else if (quickQuery) {\n <p class=\"search__empty\">{{ fmt(text.noResults, { term: quickQuery }) }}</p>\n }\n </div>\n </hm-modal>\n}\n\n","import { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { ViewService } from '@orfeu/angular/core';\nimport {\n HERMES_WORKSPACE_PERSISTENCE_CONFIG,\n TabItem,\n WorkspaceState,\n WorkspaceStore,\n createPersistedWorkspaceStore,\n findPanelTabs,\n} from '@trismegisto/angular';\nimport { Route, spineRoutesOf } from '@trismegisto/spine';\nimport { resolveEffectiveRouteChain } from '@trismegisto/spine/routing';\n\nconst HOME_PATH = '/home';\n\n/**\n * Dono do `WorkspaceStore` do shell — mesmo padrão do `WorkspaceNavService` do docs/website\n * (`packages/hermes-ui/docs/website/src/app/workspace-nav.service.ts`), adaptado pra ler a\n * árvore de rotas do BACKEND (`ViewService.currentView`) em vez de um `page-registry.ts`\n * estático. Cada página visitada vira uma aba, pertencente a um painel; a navegação real do\n * `Router` (routerLink, busca, sidebar) sempre atualiza a aba ativa do painel FOCADO.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineWorkspaceNavService {\n private readonly router = inject(Router);\n private readonly viewService = inject(ViewService);\n\n readonly store: WorkspaceStore = createPersistedWorkspaceStore(\n { tabs: [this.tabFor(HOME_PATH)], activeId: HOME_PATH },\n (id) => (this.chainFor(id) ? this.tabFor(id) : null),\n inject(HERMES_WORKSPACE_PERSISTENCE_CONFIG),\n );\n\n private readonly state = signal<WorkspaceState>(this.store.getState());\n readonly root = computed(() => this.state().root);\n readonly focusedPanelId = computed(() => this.state().focusedPanelId);\n\n /** Cadeia resolvida (header→…→page) da aba ativa do painel FOCADO — é o que `spine-sidebar`\n * (menu) e `spine-navigation` (breadcrumb) leem pra saber \"onde estamos\", no lugar do antigo\n * `viewService.logControl$`/`breadCrumb$` globais (que só existiam porque havia uma página\n * \"atual\" só; agora cada painel tem a sua). */\n readonly focusedChain = computed<Route[] | null>(() => {\n const s = this.state();\n const activeId = findPanelTabs(s.root, s.focusedPanelId)?.activeId;\n return activeId ? this.chainFor(activeId) : null;\n });\n\n private lastKnownPath = '';\n\n constructor() {\n this.store.subscribe((s) => this.state.set(s));\n\n this.router.events.subscribe((event) => {\n if (!(event instanceof NavigationEnd)) return;\n const path = event.urlAfterRedirects.split(/[?#]/)[0] || HOME_PATH;\n this.lastKnownPath = path;\n this.store.navigateActiveTab(this.state().focusedPanelId, this.tabFor(event.urlAfterRedirects));\n });\n\n // Mesma corrida documentada no WorkspaceNavService do docs/website: pula a 1ª execução, senão\n // o estado inicial (hardcoded ou recém-restaurado do sessionStorage) vence a navegação real\n // (mais lenta, resolve async) e qualquer link direto/F5 cai sempre em HOME_PATH.\n let first = true;\n effect(() => {\n const s = this.state();\n const activeId = findPanelTabs(s.root, s.focusedPanelId)?.activeId;\n if (first) {\n first = false;\n return;\n }\n if (!activeId || activeId === this.lastKnownPath) return;\n this.lastKnownPath = activeId;\n void this.router.navigateByUrl(activeId);\n });\n }\n\n /** Resolve a cadeia de rotas pra uma URL, direto na view atual — sem `Router`, sem `async`\n * (o componente da folha só é carregado por quem for de fato desenhar o painel). Desce sozinho\n * por nós organizacionais (com filhos, sem conteúdo próprio) — o rótulo/ícone da aba e o que a\n * sidebar/breadcrumb mostram refletem o destino DE VERDADE, não a rota-container clicada. */\n private chainFor(url: string): Route[] | null {\n const currentRoutes = spineRoutesOf(this.viewService.currentView);\n return resolveEffectiveRouteChain(\n currentRoutes,\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n }\n\n tabFor(url: string): TabItem {\n const path = url.split(/[?#]/)[0] || HOME_PATH;\n const leaf = this.chainFor(path)?.at(-1);\n return {\n id: path,\n label: leaf?.route_display_name ?? path,\n icon: leaf?.route_icon ?? undefined,\n };\n }\n\n /** O `+` de um painel: abre a home ali, como um navegador. */\n openNewTab(panelId: string): void {\n this.store.openTab(panelId, this.tabFor(HOME_PATH));\n }\n\n /** Navegação LOCAL a um painel específico (usada pelo `PanelLocalLinkDirective`) — troca o\n * ASSUNTO da aba ativa daquele painel, não empilha uma aba nova. */\n navigateLocally(panelId: string, href: string): void {\n this.store.navigateActiveTab(panelId, this.tabFor(href));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, NavigationSkipped, Router } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AppDef, AuthorizationService, RealmAppsService, ViewService } from '@orfeu/angular/core';\nimport { IconComponent, SidebarComponent as HermesSidebarComponent, SidebarNode, SidebarNodeComponent } from '@trismegisto/angular';\nimport { Route, routerIdOf, SPINE_MESSAGES, spineRoutesOf } from '@trismegisto/spine';\nimport { SpineWorkspaceNavService } from '../workspace/spine-workspace-nav.service';\nimport { formatMessage } from '@trismegisto/primitives';\n\n/**\n * `Route` (árvore do backend) → `SidebarNode` (genérico, o que `hm-sidebar-node` sabe desenhar).\n * Sem filtrar por `route_type`: a árvore real mistura tipos livremente por PAPEL, não por\n * profundidade fixa (achado real, 2026-09-28, com a árvore de verdade em mãos — 'menu'/'item'/\n * 'submenu'/'page' aparecem intercalados; um nó 'item' pode ter filhos 'submenu' que têm filhos\n * 'page', por exemplo \"Sistema\"). `hm-sidebar-node` já decide sozinho link-vs-grupo pela presença\n * de filhos + profundidade restante — não precisa saber o `route_type` pra nada.\n */\nfunction toSidebarNode(route: Route): SidebarNode {\n return {\n // Página: o router (a tela); grupo (sem router próprio): a rota.\n id: routerIdOf(route) ?? route.routed_id,\n label: route.route_display_name ?? '',\n icon: route.route_icon ?? undefined,\n route: route.route_redirect ?? '',\n children: (route.routes ?? []).map(toSidebarNode),\n };\n}\n\n/**\n * Menu lateral fixo — TODA a navegação do shell mora aqui agora, nunca no header (decisão\n * explícita do usuário: \"não deve ter ícones de navegação no menu superior, deve ter um menu\n * lateral de navegação fixa\" — o antigo `h-nav`/`hm-menu-button` de nível 'header'/'menu' do\n * `header.component.html` foi removido, essa navegação virou `modules` abaixo).\n *\n * Dois níveis, um de cada vez — MESMO padrão de back/forward do `docs/website`'s sidebar (achado\n * real, 2026-09-28: a primeira versão mostrava os dois SEMPRE juntos, empilhados, achando que o\n * modelo de rotas do backend não permitia \"sair\" de um módulo — errado; nada impede mostrar só um\n * nível por vez com um botão de voltar, é só um `signal` local):\n * - `modules` (nível 1, 'header', de `ViewService.currentView` direto — não muda com a navegação\n * do painel): a lista pra trocar de módulo.\n * - `menus`: a cadeia resolvida da aba ativa do painel FOCADO\n * (`SpineWorkspaceNavService.focusedChain`) — os itens do módulo ATUAL.\n * `viewingModules` decide qual dos dois aparece; volta pra `false` sozinho sempre que o módulo\n * atual muda (navegação real feita, mesma UX do `leaveModule()` do docs).\n */\n@Component({\n selector: 'spine-sidebar',\n imports: [CommonModule, HermesSidebarComponent, SidebarNodeComponent, IconComponent],\n templateUrl: './sidebar.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n /* Aplicações (só no mobile): o seletor de apps do header some abaixo de 768px e vem para a sidebar. */\n .spine-sidebar-apps { display: none; }\n @media (max-width: 767px) {\n .spine-sidebar-apps {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-micro);\n margin-bottom: var(--hm-space-sm);\n padding-bottom: var(--hm-space-sm);\n border-bottom: var(--hm-border-hairline) solid var(--hm-divider);\n }\n .spine-sidebar-apps__title {\n display: flex;\n align-items: center;\n gap: var(--hm-space-nano);\n margin: 0 var(--hm-space-xxxs);\n color: var(--hm-muted);\n font-size: var(--hm-font-size-xs);\n font-weight: var(--hm-font-weight-semibold);\n letter-spacing: 0.04em;\n text-transform: uppercase;\n }\n .spine-sidebar-apps__link {\n display: flex;\n align-items: center;\n gap: var(--hm-space-nano);\n min-height: var(--hm-space-2xl);\n padding: var(--hm-space-nano) var(--hm-space-xxxs);\n border-radius: var(--hm-radius-control);\n color: inherit;\n font-size: var(--hm-font-size-sm);\n text-decoration: none;\n }\n .spine-sidebar-apps__link:hover,\n .spine-sidebar-apps__link:focus-visible { background: var(--hm-hover); }\n }\n\n /* Achado real, 2026-09-28: \\`hm-sidebar\\` (a TAG) é \\`display: contents\\` no @trismegisto/core\n * (repassa os filhos pro pai, sem caixa própria) — \\`height\\` nela não faz NADA, por spec CSS\n * (display:contents não gera caixa principal, propriedade de tamanho é ignorada). Quem\n * realmente precisa da altura é \\`.hm-sidebar\\` (a classe, o <nav> de verdade lá dentro) — e\n * ele só recebe de verdade se ESTE host também tiver altura definida (senão \"100%\" de um pai\n * com altura automática também não é nada). Era isto que sobrava como espaço em branco: o\n * <nav> ficava do tamanho do próprio conteúdo, mas o layout ao redor já reservava a coluna\n * inteira pro sidebar.\n *\n * Segunda rodada do MESMO bug, achada ao vivo 2026-09-28 (barra branca sobrevivia ao fix\n * acima, \\`height:100%\\` sem efeito nenhum medido no DOM real): a regra \\`.hm-sidebar\\` deste\n * bloco NUNCA bateu no \\`<nav class=\"hm-sidebar\">\\` de verdade. Motivo: encapsulamento emulado\n * do Angular tagueia cada seletor com o atributo \\`_ngcontent\\` do componente DONO do template\n * onde o elemento nasce — e o \\`<nav class=\"hm-sidebar\">\\` nasce dentro do template do\n * \\`HermesSidebarComponent\\` (\\`@trismegisto/angular\\`, seletor \\`hm-sidebar\\`), não do template\n * deste \\`SidebarComponent\\` do spine. \\`<hm-sidebar>\\` (a TAG, que É filha direta do template\n * daqui) recebe o atributo certo; o \\`<nav>\\` que \\`display:contents\\` \"promove\" pra cima, não —\n * então \\`.hm-sidebar[_ngcontent-spine-x]\\` vira um seletor que não existe em lugar nenhum do\n * DOM real, silenciosamente inerte. \\`::ng-deep\\` é o jeito suportado de escrever uma regra sem\n * esse atributo, alcançando de fato o DOM interno de um componente filho.\n *\n * E o que essa regra precisa fazer: \\`.hm-sidebar\\` no \\`_sidebar.scss\\` do core tem\n * \\`flex: none\\` — certo pro caso comum (filho de um flex EM LINHA, onde só a LARGURA deve ser\n * travada por \\`width\\`/\\`min-width\\`/\\`max-width\\`, nunca deve \"crescer\"). Mas aqui \\`:host\\` é um\n * flex EM COLUNA — nesse eixo, \\`flex: none\\` também zera \\`flex-grow\\`, então o <nav> (único\n * item do eixo vertical) nunca cresce pra preencher o restante da coluna. \\`flex-grow: 1\\`\n * reforça o preenchimento pelo eixo certo (altura) sem tocar a LARGURA (eixo cruzado, continua\n * só sob controle de width/min-width/max-width do core) — escopado só no spine (\\`:host\\` na\n * frente), o core continua \\`flex: none\\` pra quem usa \\`hm-sidebar\\` direto num flex em linha\n * (docs/website, hefesto sem o wrapper de coluna). */\n :host { display: flex; flex-direction: column; height: 100%; }\n :host ::ng-deep .hm-sidebar { height: 100%; flex-grow: 1; }\n `],\n})\nexport class SidebarComponent {\n protected readonly text = inject(SPINE_MESSAGES).sidebar;\n protected readonly fmt = formatMessage;\n private readonly workspace = inject(SpineWorkspaceNavService);\n private readonly viewService = inject(ViewService);\n private readonly authService = inject(AuthorizationService);\n private readonly realmApps = inject(RealmAppsService);\n\n /** Aplicações do realm (o app atual já vem excluído pelo backend) — exibidas só no mobile. */\n protected readonly apps = signal<AppDef[]>([]);\n\n private readonly currentView = toSignal(this.viewService.currentView$, { initialValue: this.viewService.currentView });\n /** Sem nenhum crachá (nenhum grupo do app — ver `ViewGuard`, tela `/blocked`), o menu fica vazio\n * mesmo que a view traga rotas públicas: listar o que leva de volta ao \"Acesso bloqueado\" não\n * ajuda. `badges` não é sinal, mas a view sempre é refeita depois do token (`view.update`), e é\n * ela que recalcula isto. */\n protected readonly modules = computed<SidebarNode[]>(() => {\n // Irmãos de mesmo endereço já fundidos: um \"laboratorio\" só, não um por nível (ver `mergeRouteTree`).\n const routes = spineRoutesOf(this.currentView());\n if (this.authService.authenticated && !this.authService.badges.length) return [];\n return routes.map(toSidebarNode);\n });\n\n protected readonly currentModule = computed<Route | null>(() => this.workspace.focusedChain()?.[0] ?? null);\n\n /** Filhos diretos do módulo atual — sem filtrar por `route_type` (ver `toSidebarNode`). */\n protected readonly menus = computed<SidebarNode[]>(() => (this.currentModule()?.routes ?? []).map(toSidebarNode));\n\n /** Nem todo nível 1 é um \"módulo\" navegável — \"Início\"/\"Monitoração\" na árvore real são\n * `route_type: 'page'` SEM filhos, folhas diretas (achado real, 2026-09-28: mostravam\n * cabeçalho + botão voltar + área de conteúdo vazia, como se fossem módulos de verdade). Só\n * entra no modo \"dentro do módulo\" quando há algo pra mostrar como submenu. */\n protected readonly currentModuleHasChildren = computed(() => (this.currentModule()?.routes?.length ?? 0) > 0);\n\n /** `true` = mostrando a lista de módulos; `false` = mostrando o menu do módulo atual. Cai pra\n * `true` sozinho quando o módulo atual não tem submenu nenhum — nesse caso não existe \"dentro\n * do módulo\" pra mostrar. */\n private readonly wantsModules = signal(false);\n protected readonly viewingModules = computed(() => this.wantsModules() || !this.currentModuleHasChildren());\n\n /** Sem teto artificial de nível de grupo — o template não enxerga o global `Infinity`, só\n * membros da classe. Ver comentário no `.html`: o backend já limita a árvore sozinho. */\n protected readonly maxDepth = Infinity;\n\n constructor() {\n void this.realmApps.getApplications(this.authService.getToken()).then(\n list => this.apps.set(list ?? []),\n () => this.apps.set([]), // sem a lista, o bloco de aplicações só não aparece\n );\n\n // Navegou de verdade (clicou num módulo, ou entrou direto por link/F5) -> volta pro menu do\n // módulo novo. Só faz sentido reagir à IDENTIDADE do módulo (router da página ou, num grupo, a\n // rota -- módulo costuma ser grupo, sem router próprio), não ao objeto inteiro\n // (a cadeia inteira muda a cada troca de aba dentro do MESMO módulo também).\n let lastModuleId: string | null | undefined;\n effect(() => {\n const module = this.currentModule();\n const id = module ? routerIdOf(module) ?? module.routed_id : null;\n if (id !== lastModuleId) {\n lastModuleId = id;\n this.wantsModules.set(false);\n }\n });\n\n // O efeito acima não cobre voltar pro MESMO módulo: dentro de \"Sistema\", \"← Módulos\" e\n // clicar em \"Sistema\" de novo navega (a rota muda), mas a identidade do módulo é a mesma — o\n // efeito não dispara e a lista de módulos ficava na tela (achado real, 2026-09-29: só\n // funcionava passando por outro módulo antes). Qualquer navegação concluída é um \"entrar\".\n // NavigationSkipped também: clicar no módulo cuja página já está aberta cai no ViewGuard\n // (`/sys` cancela e redireciona pra `/sys/about/resources`), e o redirect pra URL ATUAL é\n // descartado pelo Router como \"mesma URL\" — não emite NavigationEnd nenhum.\n inject(Router).events.pipe(\n filter(e => e instanceof NavigationEnd || e instanceof NavigationSkipped),\n takeUntilDestroyed(),\n ).subscribe(() => this.wantsModules.set(false));\n }\n\n protected showModules(): void {\n this.wantsModules.set(true);\n }\n}\n","<hm-sidebar\n *ngIf=\"modules().length != 0 || menus().length != 0\"\n [label]=\"!viewingModules() && currentModule() ? fmt(text.moduleNavigation, { module: currentModule()!.route_display_name ?? '' }) : text.modules\"\n [heading]=\"!viewingModules() ? (currentModule()?.route_display_name ?? '') : ''\"\n [headingIcon]=\"currentModule()?.route_icon ?? 'grid'\"\n [backLabel]=\"!viewingModules() && modules().length > 1 ? text.modules : ''\"\n [direction]=\"viewingModules() ? 'back' : 'forward'\"\n (back)=\"showModules()\"\n>\n <!-- Só no mobile: o seletor de aplicações do header some e vem para cá. -->\n @if (apps().length) {\n <section class=\"spine-sidebar-apps\" [attr.aria-label]=\"text.apps\">\n <p class=\"spine-sidebar-apps__title\"><hm-icon shape=\"grid\" /> {{ text.apps }}</p>\n @for (app of apps(); track app.app_url) {\n <a class=\"spine-sidebar-apps__link\" [href]=\"app.app_url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <hm-icon shape=\"applications\" />\n <span>{{ app.name }}</span>\n </a>\n }\n </section>\n }\n @if (viewingModules()) {\n @for (m of modules(); track m.id) {\n <hm-sidebar-node [node]=\"m\" [depth]=\"0\" />\n }\n } @else {\n @for (menu of menus(); track menu.id) {\n <!-- Infinity, não um número fixo: o backend do spine já usa `route_type` pra limitar a\n árvore a 6 níveis (header→navigation→menu→item→submenu→page — ver `route.model.ts`),\n então não há necessidade de um segundo teto aqui. Um teto baixo (achado ao vivo,\n 2026-09-28: `depth=2`) forçava o penúltimo nível a virar link plano mesmo tendo\n filhos reais (ex.: \"submenu\" com páginas embaixo sumia da árvore visível). -->\n <hm-sidebar-node [node]=\"menu\" [depth]=\"maxDepth\" />\n }\n }\n</hm-sidebar>\n","// Geometria do tour: o recorte iluminado (holofote) em volta do alvo e onde o balão cabe. Funções\n// puras, sem DOM — o componente mede e aplica.\n\nexport interface TourRect {\n readonly top: number;\n readonly left: number;\n readonly width: number;\n readonly height: number;\n}\n\nexport interface TourSize {\n readonly width: number;\n readonly height: number;\n}\n\nexport interface TourCardPosition {\n top: number;\n left: number;\n centered: boolean;\n}\n\n/** Folga do holofote em volta do alvo (cada lado). */\nexport const TOUR_SPOT_PADDING = 6;\n/** Distância entre o holofote e o balão. */\nexport const TOUR_CARD_GAP = 14;\n/** Distância mínima do balão às bordas da janela — a mesma do `max-width: calc(100vw - 24px)` do SCSS. */\nexport const TOUR_EDGE = 12;\n/** Largura do balão no SCSS (`.ob-card`), usada enquanto ele ainda não foi medido. */\nexport const TOUR_CARD_WIDTH = 332;\n/** Altura provável do balão antes da primeira medida (título + duas linhas + rodapé). */\nexport const TOUR_CARD_HEIGHT_GUESS = 190;\n\n/** Holofote: o retângulo do alvo com a mesma folga nos quatro lados. */\nexport function tourSpotlight(target: TourRect, padding = TOUR_SPOT_PADDING): TourRect {\n return {\n top: target.top - padding,\n left: target.left - padding,\n width: target.width + padding * 2,\n height: target.height + padding * 2,\n };\n}\n\n/** Largura que o balão de fato ocupa: a do CSS, limitada pela janela menos as margens. */\nexport function tourCardWidth(width: number, viewport: TourSize): number {\n return Math.max(0, Math.min(width, viewport.width - TOUR_EDGE * 2));\n}\n\n/** Prende `value` entre a margem e o maior início que ainda deixa `size` dentro de `room`. */\nfunction clampStart(value: number, size: number, room: number): number {\n return Math.max(TOUR_EDGE, Math.min(value, room - TOUR_EDGE - size));\n}\n\n/**\n * Onde o balão fica. Sem holofote: no meio da janela (`centered`). Com holofote, a primeira posição que\n * cabe: embaixo, em cima (ambas alinhadas à esquerda do holofote), à direita, à esquerda (ambas\n * alinhadas ao topo dele) e, se nada couber, no meio da janela por cima do alvo.\n */\nexport function placeTourCard(spot: TourRect | null, card: TourSize, viewport: TourSize): TourCardPosition {\n const width = tourCardWidth(card.width, viewport);\n const height = card.height;\n const centerTop = Math.max(TOUR_EDGE, (viewport.height - height) / 2);\n const centerLeft = Math.max(TOUR_EDGE, (viewport.width - width) / 2);\n if (!spot) return { top: centerTop, left: centerLeft, centered: true };\n\n const left = clampStart(spot.left, width, viewport.width);\n const top = clampStart(spot.top, height, viewport.height);\n\n const below = spot.top + spot.height + TOUR_CARD_GAP;\n if (below + height <= viewport.height - TOUR_EDGE) return { top: below, left, centered: false };\n\n const above = spot.top - TOUR_CARD_GAP - height;\n if (above >= TOUR_EDGE) return { top: above, left, centered: false };\n\n const right = spot.left + spot.width + TOUR_CARD_GAP;\n if (right + width <= viewport.width - TOUR_EDGE) return { top, left: right, centered: false };\n\n const leftSide = spot.left - TOUR_CARD_GAP - width;\n if (leftSide >= TOUR_EDGE) return { top, left: leftSide, centered: false };\n\n return {\n top: clampStart(centerTop, height, viewport.height),\n left: clampStart(centerLeft, width, viewport.width),\n centered: false,\n };\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterRenderRef, ChangeDetectorRef, Component, ElementRef, HostListener, Injector, OnDestroy, OnInit, ViewChild, ChangeDetectionStrategy, afterNextRender, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ButtonComponent } from '@trismegisto/angular';\nimport { OnboardingService, OnboardingStep, findTourTarget } from './onboarding.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\nimport {\n TOUR_CARD_HEIGHT_GUESS,\n TOUR_CARD_WIDTH,\n TourCardPosition,\n TourSize,\n placeTourCard,\n tourSpotlight,\n} from './onboarding-placement';\n\ninterface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * Desenho do tour guiado: escurece a tela, recorta um holofote sobre o alvo do passo e põe o balão\n * (título, texto, progresso e navegação) onde couber. Segue o `OnboardingService`; recalcula a cada\n * passo e quando a janela rola ou muda de tamanho.\n */\n@Component({\n selector: 'spine-onboarding-overlay',\n imports: [CommonModule, ButtonComponent],\n templateUrl: './onboarding-overlay.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './onboarding-overlay.component.scss',\n})\nexport class OnboardingOverlayComponent implements OnInit, OnDestroy {\n protected readonly text = inject(SPINE_MESSAGES).tour;\n protected readonly fmt = formatMessage;\n @ViewChild('cardEl') cardRef?: ElementRef<HTMLDivElement>;\n\n public step: OnboardingStep | null = null;\n public index = 0;\n public total = 0;\n\n /** holofote (null = passo centralizado, sem recorte). */\n public spot: Box | null = null;\n /** posição do balão. */\n public card: { top: number; left: number; centered: boolean } = { top: 0, left: 0, centered: true };\n\n private sub?: Subscription;\n private reposition?: AfterRenderRef;\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n\n constructor(private onboarding: OnboardingService) {}\n\n get isFirst(): boolean { return this.onboarding.isFirst; }\n get isLast(): boolean { return this.onboarding.isLast; }\n\n ngOnInit(): void {\n this.sub = this.onboarding.current$.subscribe((cur) => {\n // O passo chega de fora da detecção de mudanças (timer do serviço, clique no balão): marca a\n // view, senão um app sem zone.js não redesenha.\n this.cdr.markForCheck();\n if (!cur) { this.step = null; this.spot = null; return; }\n this.step = cur.step;\n this.index = cur.index;\n this.total = cur.total;\n this.layout();\n });\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n this.reposition?.destroy();\n }\n\n /** Holofote e balão do passo atual: primeiro com a altura estimada, depois com a medida real. */\n private layout(): void {\n const step = this.step;\n if (!step) return;\n const target = step.target ? findTourTarget(step.target) : null;\n if (target) this.bringIntoView(target);\n this.spot = target ? tourSpotlight(target.getBoundingClientRect()) : null;\n this.card = placeTourCard(this.spot, this.cardSize(TOUR_CARD_HEIGHT_GUESS), this.viewport());\n this.positionCard();\n }\n\n /**\n * Refina a posição depois que o balão foi desenhado (a altura depende do texto). Roda depois do\n * render e só marca a view se a posição mudou: sem NG0100 e sem precisar do zone.js.\n */\n private positionCard(): void {\n this.reposition?.destroy();\n this.reposition = afterNextRender(\n {\n read: () => {\n const height = this.cardRef?.nativeElement.offsetHeight ?? 0;\n if (!this.step || !height) return;\n const next = placeTourCard(this.spot, this.cardSize(height), this.viewport());\n if (!this.samePosition(next)) {\n this.card = next;\n this.cdr.markForCheck();\n }\n },\n },\n { injector: this.injector },\n );\n }\n\n /** Alvo fora da faixa visível: rola até o meio antes de medir (o `scroll` da janela refaz a conta). */\n private bringIntoView(target: HTMLElement): void {\n const rect = target.getBoundingClientRect();\n if (rect.top >= 0 && rect.bottom <= window.innerHeight) return;\n const calm = typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n target.scrollIntoView({ block: 'center', inline: 'nearest', behavior: calm ? 'auto' : 'smooth' });\n }\n\n /** Largura que o CSS dá ao balão (medida quando já existe) e a altura informada. */\n private cardSize(height: number): TourSize {\n const measured = this.cardRef?.nativeElement.offsetWidth ?? 0;\n return { width: measured || TOUR_CARD_WIDTH, height };\n }\n\n private viewport(): TourSize {\n return { width: window.innerWidth, height: window.innerHeight };\n }\n\n private samePosition(next: TourCardPosition): boolean {\n return next.top === this.card.top && next.left === this.card.left && next.centered === this.card.centered;\n }\n\n @HostListener('window:resize')\n @HostListener('window:scroll')\n onViewportChange(): void {\n if (this.step) this.layout();\n }\n\n // ── ações ──\n next(): void { this.onboarding.next(); }\n prev(): void { this.onboarding.prev(); }\n skip(): void { this.onboarding.finish(); }\n}\n","<div class=\"ob-root\" *ngIf=\"step\">\n <!-- Holofote: recorte iluminado sobre o alvo (o escuro vem do box-shadow gigante). -->\n <div class=\"ob-spot\" *ngIf=\"spot\"\n [style.top.px]=\"spot.top\" [style.left.px]=\"spot.left\"\n [style.width.px]=\"spot.width\" [style.height.px]=\"spot.height\"></div>\n\n <!-- Passos centralizados (sem alvo): escurece a tela inteira. -->\n <div class=\"ob-dim\" *ngIf=\"!spot\"></div>\n\n <!-- Balão -->\n <div #cardEl class=\"ob-card\" [class.is-centered]=\"card.centered\"\n [style.top.px]=\"card.top\" [style.left.px]=\"card.left\">\n <div class=\"ob-card__head\">\n <h3 class=\"ob-card__title\">{{ step.title }}</h3>\n <span class=\"ob-progress\">{{ fmt(text.progress, { current: index + 1, total: total }) }}</span>\n </div>\n <p class=\"ob-card__desc\" [innerHTML]=\"step.description\"></p>\n\n <div class=\"ob-card__foot\">\n <hm-button class=\"ob-skip\" emphasis=\"minimal\" (clicked)=\"skip()\">{{ text.skip }}</hm-button>\n <div class=\"ob-card__foot-actions\">\n <hm-button *ngIf=\"!isFirst\" emphasis=\"medium\" (clicked)=\"prev()\">{{ text.back }}</hm-button>\n <hm-button (clicked)=\"next()\">\n {{ isLast ? text.finish : text.next }}\n </hm-button>\n </div>\n </div>\n </div>\n</div>\n","import { renderIconSvg } from '@trismegisto/icons';\nimport { SpineNewsIllustration } from '@trismegisto/spine';\n\n/** Literal colors and font for the slide artwork (an image cannot see the page's CSS variables). */\nexport interface NewsPalette {\n readonly background: string;\n readonly icon: string;\n readonly badge: string;\n readonly badgeBorder: string;\n readonly label: string;\n readonly font: string;\n}\n\nconst LIGHT_FALLBACK: NewsPalette = {\n background: '#f3f4f6',\n icon: '#2f6fdb',\n badge: '#ffffff',\n badgeBorder: '#d5d9e0',\n label: '#1e2329',\n font: 'sans-serif',\n};\n\nexport function readNewsPalette(doc: Document): NewsPalette {\n const style = doc.body ? doc.defaultView?.getComputedStyle(doc.body) : undefined;\n const pick = (prop: string, fallback: string) => (style?.getPropertyValue(prop) ?? '').trim() || fallback;\n return {\n background: pick('--hm-surface-raised', LIGHT_FALLBACK.background),\n icon: pick('--hm-accent', LIGHT_FALLBACK.icon),\n badge: pick('--hm-surface', LIGHT_FALLBACK.badge),\n badgeBorder: pick('--hm-divider', LIGHT_FALLBACK.badgeBorder),\n label: pick('--hm-text', LIGHT_FALLBACK.label),\n font: (style?.fontFamily ?? '').trim() || LIGHT_FALLBACK.font,\n };\n}\n\nconst XML_ENTITIES: Record<string, string> = { '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' };\n\nfunction xml(value: string): string {\n return value.replace(/[&<>\"']/g, (ch) => XML_ENTITIES[ch]);\n}\n\nconst WIDTH = 640;\nconst HEIGHT = 360;\nconst CX = WIDTH / 2;\nconst CY = 168;\n\n/** Places a catalog icon (24-unit grid, stroked with currentColor) as a nested, tinted <svg>. */\nfunction icon(shape: string, x: number, y: number, size: number, color: string): string {\n return renderIconSvg(shape).replace(\n /^<svg\\b/,\n `<svg x=\"${x}\" y=\"${y}\" width=\"${size}\" height=\"${size}\" color=\"${xml(color)}\"`,\n );\n}\n\n/** Four-point twinkle, the \"something new\" cue drawn around the hero icon. */\nfunction sparkle(x: number, y: number, r: number, color: string, opacity: number): string {\n const k = r * 0.28;\n const d = `M${x} ${y - r}Q${x + k} ${y - k} ${x + r} ${y}Q${x + k} ${y + k} ${x} ${y + r}Q${x - k} ${y + k} ${x - r} ${y}Q${x - k} ${y - k} ${x} ${y - r}Z`;\n return `<path d=\"${d}\" fill=\"${xml(color)}\" opacity=\"${opacity}\"/>`;\n}\n\nfunction round(n: number): number {\n return Math.round(n * 10) / 10;\n}\n\nexport function buildNewsIllustration(illustration: SpineNewsIllustration, palette: NewsPalette): string {\n const satellites = illustration.satellites ?? [];\n const orbiting = satellites.length > 0;\n const c = {\n bg: xml(palette.background),\n accent: xml(palette.icon),\n badge: xml(palette.badge),\n border: xml(palette.badgeBorder),\n label: xml(palette.label),\n };\n\n const heroRadius = orbiting ? 58 : 92;\n const heroIcon = orbiting ? 64 : 104;\n const parts: string[] = [`<rect width=\"${WIDTH}\" height=\"${HEIGHT}\" rx=\"28\" fill=\"${c.bg}\"/>`];\n\n if (orbiting) {\n parts.push(\n `<ellipse cx=\"${CX}\" cy=\"${CY}\" rx=\"214\" ry=\"104\" fill=\"none\" stroke=\"${c.accent}\" stroke-opacity=\".22\" stroke-width=\"2\" stroke-dasharray=\"2 10\" stroke-linecap=\"round\"/>`,\n );\n } else {\n parts.push(`<circle cx=\"${CX}\" cy=\"${CY + 8}\" r=\"${heroRadius + 34}\" fill=\"${c.accent}\" opacity=\".07\"/>`);\n }\n\n parts.push(\n `<circle cx=\"${CX}\" cy=\"${CY}\" r=\"${heroRadius}\" fill=\"${c.badge}\" stroke=\"${c.border}\" stroke-width=\"2\"/>`,\n `<circle cx=\"${CX}\" cy=\"${CY}\" r=\"${heroRadius - 10}\" fill=\"${c.accent}\" opacity=\".1\"/>`,\n icon(illustration.icon, CX - heroIcon / 2, CY - heroIcon / 2, heroIcon, palette.icon),\n sparkle(CX + heroRadius + 14, CY - heroRadius + 4, 13, palette.icon, 0.85),\n sparkle(CX - heroRadius - 8, CY + heroRadius - 18, 8, palette.icon, 0.5),\n );\n\n satellites.forEach((sat, i) => {\n // Start at the top-left so a lone satellite never sits on the hero's sparkle.\n const angle = -Math.PI * 0.75 + (i * 2 * Math.PI) / satellites.length;\n const x = round(CX + 214 * Math.cos(angle));\n const y = round(CY + 104 * Math.sin(angle));\n parts.push(\n `<g transform=\"translate(${x} ${y})\"><g class=\"sat\" style=\"animation-delay:${-(i * 1.3).toFixed(1)}s\">`,\n `<circle r=\"28\" fill=\"${c.badge}\" stroke=\"${c.border}\" stroke-width=\"2\"/>`,\n icon(sat.icon, -14, -14, 28, palette.icon),\n `<text y=\"48\" text-anchor=\"middle\" font-size=\"15\" fill=\"${c.label}\">${xml(sat.label)}</text>`,\n `</g></g>`,\n );\n });\n\n const style = orbiting\n ? '<style>.sat{animation:drift 5.6s ease-in-out infinite alternate}' +\n '@keyframes drift{from{transform:translateY(-5px)}to{transform:translateY(5px)}}' +\n '@media (prefers-reduced-motion:reduce){.sat{animation:none}}</style>'\n : '';\n\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${WIDTH} ${HEIGHT}\" width=\"${WIDTH}\" height=\"${HEIGHT}\" ` +\n `font-family=\"${xml(palette.font)}\">${style}${parts.join('')}</svg>`;\n return `data:image/svg+xml,${encodeURIComponent(svg)}`;\n}\n","import { ChangeDetectionStrategy, Component, DOCUMENT, computed, inject } from '@angular/core';\nimport { ButtonComponent, CarouselComponent, ModalComponent } from '@trismegisto/angular';\nimport { buildNewsIllustration, readNewsPalette } from './news-illustration';\nimport { SpineNewsService } from './news.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Painel de novidades: um diálogo com carrossel — \"olha o que mudou\", não tutorial (esse é o tour\n * de boas-vindas). Montado uma vez no layout; quem decide quando abre é o `SpineNewsService`.\n */\n@Component({\n selector: 'spine-news',\n imports: [ModalComponent, CarouselComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (news.isOpen()) {\n <hm-modal [heading]=\"text.heading\" size=\"medium\" [open]=\"true\" (closed)=\"news.close()\">\n <hm-carousel [label]=\"text.carousel\" [slides]=\"slides()\" />\n <ng-container footer>\n <hm-button (clicked)=\"news.close()\">{{ text.dismiss }}</hm-button>\n </ng-container>\n </hm-modal>\n }\n `,\n})\nexport class SpineNewsComponent {\n protected readonly news = inject(SpineNewsService);\n protected readonly text = inject(SPINE_MESSAGES).news;\n private readonly document = inject(DOCUMENT);\n\n /** O hm-carousel pede `image`/`alt` sempre presentes (vazios = sem imagem / decorativa). A\n * ilustração é desenhada na hora de abrir, com as cores do tema daquele momento. */\n protected readonly slides = computed(() => {\n if (!this.news.isOpen()) return [];\n const palette = readNewsPalette(this.document);\n return this.news.slides().map((s) => ({\n title: s.title,\n text: s.text,\n image: s.image ?? (s.illustration ? buildNewsIllustration(s.illustration, palette) : ''),\n // Ilustração é decorativa: o título e o texto do slide já dizem tudo.\n alt: s.image ? (s.alt ?? '') : '',\n }));\n });\n}\n","import { Component, OnDestroy, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ButtonComponent, HermesShortcutService, ModalComponent, ShortcutListComponent } from '@trismegisto/angular';\nimport { ShortcutGroup, ShortcutService } from './shortcut.service';\nimport { OnboardingService } from '../onboarding/onboarding.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Painel de atalhos (cheatsheet). Abre com \"?\" (via `ShortcutService.help$`) e lista, com o\n * `hm-shortcut-list` da lib, os atalhos agrupados — com busca e o interruptor dos atalhos de tecla\n * única (WCAG 2.1.4; a escolha persiste no `SpinePreferencesService`). Também é o último passo do\n * onboarding.\n */\n@Component({\n selector: 'spine-shortcuts-cheatsheet',\n imports: [ModalComponent, ButtonComponent, ShortcutListComponent],\n templateUrl: './shortcuts-cheatsheet.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './shortcuts-cheatsheet.component.scss',\n})\nexport class ShortcutsCheatsheetComponent implements OnInit, OnDestroy {\n public open = false;\n protected readonly text = inject(SPINE_MESSAGES).shortcuts;\n private readonly shortcuts = inject(ShortcutService);\n private readonly onboarding = inject(OnboardingService);\n /** Atalhos do painel: registrados (favoritos numa linha só) + os que outra peça dispara. */\n protected readonly items = this.shortcuts.panelItems;\n /** Atalhos de tecla única ligados — sem eles o \"?\" da dica não funciona. */\n protected readonly characterKeys = inject(HermesShortcutService).characterKeys;\n /** Dica com a tecla no meio: o texto do catálogo partido em volta de `{key}`. */\n protected get hintParts(): string[] {\n return this.text.hint.split('{key}');\n }\n\n /** @deprecated O painel agora é o `hm-shortcut-list`; use `ShortcutService.panelItems()`. Sai numa próxima versão. */\n public get groups(): ShortcutGroup[] {\n return this.shortcuts.groups();\n }\n\n /** @deprecated As teclas são desenhadas pelo `hm-shortcut-list`. Sai numa próxima versão. */\n chips(keys: string): string[] {\n return keys.split('+').map((k) => k.trim()).filter(Boolean);\n }\n\n private sub?: Subscription;\n\n /** Reabre o tour de onboarding e fecha este painel. */\n replayTour(): void {\n this.open = false;\n this.onboarding.restart();\n }\n\n ngOnInit(): void {\n this.sub = this.shortcuts.help$.subscribe(() => (this.open = !this.open));\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"open = $event\" [heading]=\"text.heading\" size=\"large\">\n <!-- Com a tecla única desligada (WCAG 2.1.4) o \"?\" não abre o painel: a dica some junto. -->\n @if (characterKeys()) {\n <p class=\"sc-hint\">\n {{ hintParts[0] }}<kbd class=\"sc-chip\">?</kbd>{{ hintParts[1] }}\n </p>\n }\n\n <hm-shortcut-list searchable characterKeysToggle [registered]=\"false\" [items]=\"items()\" />\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" icon=\"play\" (clicked)=\"replayTour()\">{{ text.replayTour }}</hm-button>\n <hm-button (clicked)=\"open = false\">{{ text.dismiss }}</hm-button>\n </ng-container>\n</hm-modal>\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AUTH_CONFIG, AuthorizationService } from '@orfeu/angular/core';\n\n/** Um método de verificação em duas etapas, como o Argos devolve (nunca o segredo do TOTP). */\nexport interface AccountMethod {\n method_id: string;\n /** `totp`, `email`, `sms`... (nome fixo do método no Argos). */\n method_name: string;\n active: boolean;\n /** E-mail/telefone mascarados. */\n secret?: string;\n}\n\n/** `GET {api}/security`: métodos, política do realm, códigos de recuperação e estado da reautenticação. */\nexport interface AccountOverview {\n user: { username: string; name: string | null; email: string };\n policy: { required: boolean };\n methods: AccountMethod[];\n recovery_codes: { remaining: number };\n /** Id do \"método\" código de recuperação (reautenticação com um código). */\n recovery_method_id: string;\n reauthenticated: boolean;\n reauth_expires_in: number;\n /** Só na resposta do cadastro do primeiro método: os códigos de recuperação, exibidos uma vez. */\n recovery_codes_issued?: string[];\n}\n\n/** Uma sessão (um login num navegador) e os aplicativos que a usam. */\nexport interface AccountSession {\n id: string;\n /** A sessão deste login (a do token do app). */\n current: boolean;\n /** Outra sessão do mesmo navegador. */\n this_device: boolean;\n device: { browser?: string | null; os?: string | null; mobile: boolean; label: string };\n ip: string | null;\n created_at: string;\n last_seen_at: string;\n /** `false`: o login no Argos venceu, só o refresh de algum aplicativo segue vivo. */\n sso_active: boolean;\n clients: { client_id: string; name: string | null }[];\n}\n\nexport type AccountReauth = { password: string } | { method_id: string; code: string };\n\n/**\n * Base da API da conta no Argos: `{authority}/api/realms/{realm}/account` — o mesmo `{authority}/api` que o\n * `@orfeu/angular` usa para o OIDC (a `authority` já traz o contexto do serviço, ex.: `https://host/argos`).\n * Sem `authority`/`realm` (ou com o `CHANGE_ME` de um environment ainda não preenchido) devolve `null`.\n */\nexport function argosAccountApi(authority: string | null | undefined, realm: string | null | undefined): string | null {\n const realmId = realm?.trim();\n if (authority == null || !realmId || authority.includes('CHANGE_ME') || realmId.includes('CHANGE_ME')) return null;\n return `${authority.trim().replace(/\\/+$/, '')}/api/realms/${encodeURIComponent(realmId)}/account`;\n}\n\n/**\n * Conta do usuário no Argos (verificação em duas etapas, códigos de recuperação, sessões) pela API da conta\n * com Bearer: o access token da sessão do app (`@orfeu/angular`), no header `Authorization` — o mesmo jeito\n * que o Orfeu fala com o Argos (ex.: `switchBadge`). O Argos reconhece a sessão SSO pelo `sid` do token; não\n * há cookie envolvido. Token vencido (`401 invalid_token`): renova uma vez (`silentRenew`) e repete.\n * `available` é falso sem `AUTH_CONFIG` utilizável.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineAccountSecurityService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n private readonly config = inject(AUTH_CONFIG, { optional: true });\n\n readonly baseUrl = argosAccountApi(this.config?.authority, this.config?.realmId);\n readonly available = !!this.baseUrl;\n\n overview(): Promise<AccountOverview> {\n return this.send('GET', '/security');\n }\n\n reauthenticate(proof: AccountReauth): Promise<{ reauthenticated: boolean; reauth_expires_in: number }> {\n return this.send('POST', '/reauth', proof);\n }\n\n requestReauthCode(methodId: string): Promise<{ method_id: string; expires_in: number }> {\n return this.send('POST', '/reauth/request', { method_id: methodId });\n }\n\n configure(methodId: string, email?: string): Promise<{ method_id: string; secret?: string; qrcode?: string; expires_in?: number }> {\n return this.send('POST', '/mfa/configure', email ? { method_id: methodId, email } : { method_id: methodId });\n }\n\n register(methodId: string, code: string): Promise<AccountOverview> {\n return this.send('POST', '/mfa/register', { method_id: methodId, code });\n }\n\n remove(methodId: string): Promise<AccountOverview> {\n return this.send('POST', '/mfa/remove', { method_id: methodId });\n }\n\n regenerateRecoveryCodes(): Promise<{ recovery_codes: string[]; remaining: number }> {\n return this.send('POST', '/recovery-codes', {});\n }\n\n sessions(): Promise<{ sessions: AccountSession[] }> {\n return this.send('GET', '/sessions');\n }\n\n endSession(sid: string): Promise<{ ended: boolean; current: boolean }> {\n return this.send('DELETE', `/sessions/${encodeURIComponent(sid)}`);\n }\n\n endOtherSessions(): Promise<{ ended: number }> {\n return this.send('DELETE', '/sessions/others');\n }\n\n private async send<T>(method: 'GET' | 'POST' | 'DELETE', path: string, body?: object): Promise<T> {\n try {\n return await this.request<T>(method, path, body);\n } catch (err) {\n if (!(err instanceof HttpErrorResponse && err.status === 401 && err.error?.error === 'invalid_token')) throw err;\n await this.auth.silentRenew();\n return this.request<T>(method, path, body);\n }\n }\n\n private request<T>(method: 'GET' | 'POST' | 'DELETE', path: string, body?: object): Promise<T> {\n if (!this.baseUrl) return Promise.reject(new Error('[hermes-spine] API da conta sem AUTH_CONFIG (authority/realmId).'));\n const headers = new HttpHeaders({ Authorization: `Bearer ${this.auth.getToken() ?? ''}` });\n return firstValueFrom(this.http.request<T>(method, `${this.baseUrl}${path}`, { body, headers }));\n }\n}\n\n/** Código de erro que o Argos devolveu (`{ error: 'invalid_code' }`), ou `''`. */\nexport function accountErrorCode(err: unknown): string {\n if (!(err instanceof HttpErrorResponse)) return '';\n const code = (err.error as { error?: unknown } | null)?.error;\n return typeof code === 'string' ? code : err.status === 0 ? 'network' : '';\n}\n","import { Directive, Injectable, computed, inject, signal } from '@angular/core';\nimport { AccountMethod, AccountOverview, AccountReauth, SpineAccountSecurityService, accountErrorCode } from './account-security.service';\n\n/** O que a pessoa pediu: adicionar/trocar/remover um método ou gerar códigos de recuperação. */\nexport type AccountAction =\n | { kind: 'add' | 'replace' | 'remove'; method: AccountMethod }\n | { kind: 'codes' };\n\nexport type AccountStep = 'idle' | 'reauth' | 'confirm-remove' | 'enroll-totp' | 'enroll-email' | 'enroll-email-code' | 'codes';\n\n/** Avisos de sucesso (chaves de `SpineMessages.accountSecurity`). */\nexport type AccountNotice = 'methodAdded' | 'deviceReplaced' | 'methodRemoved' | 'codesRegenerated' | 'reauthCodeSent';\n\n/** Métodos que o painel trata (o Argos só tem fluxo para estes; o SMS aparece como indisponível). */\nconst SUPPORTED = ['totp', 'email', 'sms'];\nconst nameOf = (m: AccountMethod | null | undefined) => m?.method_name?.toLowerCase() ?? '';\nexport const isTotp = (m: AccountMethod | null | undefined) => nameOf(m) === 'totp';\nexport const isEmail = (m: AccountMethod | null | undefined) => nameOf(m) === 'email';\nexport const isSms = (m: AccountMethod | null | undefined) => nameOf(m) === 'sms';\n\n/**\n * Estado da seção \"Conta e segurança\" do painel de configurações: visão geral do Argos e o fluxo de uma\n * alteração (reautenticação → cadastro/remoção/códigos). Mesmo roteiro da tela \"Segurança da conta\" do\n * Argos: toda alteração pede antes a prova de identidade recente (senha ou um fator ativo, 5 minutos no\n * servidor); a recusa `reauthentication_required` no meio volta para a prova e a ação segue depois dela.\n *\n * Uma instância por abertura do painel (`spineAccountSecurity` no `hm-settings-section`): os códigos de\n * recuperação e o QR Code somem quando o painel fecha.\n */\n@Injectable()\nexport class SpineAccountSecurityState {\n private readonly api = inject(SpineAccountSecurityService);\n\n readonly available = this.api.available;\n readonly loading = signal(false);\n /** Código do erro ao carregar (`login_required`, `network`...); `''` = carregou. */\n readonly loadError = signal('');\n readonly overview = signal<AccountOverview | null>(null);\n\n readonly step = signal<AccountStep>('idle');\n readonly action = signal<AccountAction | null>(null);\n readonly busy = signal(false);\n /** Código do último erro de uma ação (`invalid_code`...). */\n readonly error = signal('');\n readonly notice = signal<AccountNotice | null>(null);\n\n /** Como provar a identidade: `password`, o id de um método ativo ou o id do código de recuperação. */\n readonly reauthMode = signal('password');\n readonly reauthCodeSent = signal(false);\n /** Até quando (epoch ms) a reautenticação vale, pelo que o servidor informou. */\n private reauthUntil = 0;\n\n readonly totpSetup = signal<{ secret: string; qrcode: string } | null>(null);\n readonly enrollEmail = signal('');\n /** Códigos de recuperação recém-gerados: só existem aqui, até a pessoa dizer que guardou. */\n readonly issuedCodes = signal<string[] | null>(null);\n\n readonly methods = computed(() => (this.overview()?.methods ?? []).filter((m) => SUPPORTED.includes(nameOf(m))));\n readonly activeMethods = computed(() => this.methods().filter((m) => m.active));\n readonly remainingCodes = computed(() => this.overview()?.recovery_codes.remaining ?? 0);\n readonly recoveryMethodId = computed(() => this.overview()?.recovery_method_id ?? '');\n /** Linha da última ação (métodos ou códigos): é ela que mostra o fluxo, o erro e o aviso. */\n readonly owner = signal<'methods' | 'codes'>('methods');\n\n constructor() {\n if (this.available) void this.load();\n }\n\n async load(): Promise<void> {\n this.loading.set(true);\n try {\n this.apply(await this.api.overview());\n this.loadError.set('');\n } catch (err) {\n this.loadError.set(accountErrorCode(err) || 'generic');\n } finally {\n this.loading.set(false);\n }\n }\n\n /** Com MFA obrigatório, o último método ativo não sai (o servidor também recusa: `mfa_last_method`). */\n canRemove(method: AccountMethod): boolean {\n return !(this.overview()?.policy.required && this.activeMethods().length <= 1 && method.active);\n }\n\n // ── Início de uma ação: reautentica se preciso, depois segue ───────────────\n start(action: AccountAction): void {\n this.error.set('');\n this.notice.set(null);\n this.issuedCodes.set(null);\n this.action.set(action);\n this.owner.set(action.kind === 'codes' ? 'codes' : 'methods');\n if (Date.now() < this.reauthUntil) void this.run(() => this.proceed());\n else this.openReauth();\n }\n\n cancel(): void {\n this.action.set(null);\n this.step.set('idle');\n this.error.set('');\n this.totpSetup.set(null);\n // Códigos de recuperação não ficam na memória da tela depois que o fluxo é abandonado.\n this.issuedCodes.set(null);\n }\n\n private openReauth(): void {\n this.reauthCodeSent.set(false);\n this.reauthMode.set('password');\n this.step.set('reauth');\n }\n\n chooseReauth(mode: string): void {\n this.error.set('');\n this.notice.set(null);\n this.reauthCodeSent.set(false);\n this.reauthMode.set(mode);\n }\n\n sendReauthCode(): Promise<void> {\n return this.run(async () => {\n await this.api.requestReauthCode(this.reauthMode());\n this.reauthCodeSent.set(true);\n this.notice.set('reauthCodeSent');\n });\n }\n\n confirmReauth(proof: AccountReauth): Promise<void> {\n return this.run(async () => {\n const response = await this.api.reauthenticate(proof);\n this.reauthUntil = Date.now() + (response?.reauth_expires_in ?? 0) * 1000;\n this.notice.set(null);\n await this.proceed();\n });\n }\n\n // ── Depois da reautenticação (sempre de dentro de run()) ───────────────────\n private async proceed(): Promise<void> {\n const action = this.action();\n if (!action) return;\n if (action.kind === 'remove') {\n this.step.set('confirm-remove');\n return;\n }\n if (action.kind === 'codes') {\n const result = await this.api.regenerateRecoveryCodes();\n this.issuedCodes.set(result.recovery_codes);\n this.step.set('codes');\n await this.refresh();\n return;\n }\n if (isTotp(action.method)) {\n const setup = await this.api.configure(action.method.method_id);\n this.totpSetup.set({ secret: setup.secret ?? '', qrcode: setup.qrcode ?? '' });\n this.step.set('enroll-totp');\n return;\n }\n this.step.set('enroll-email');\n }\n\n sendEnrollEmail(email: string): Promise<void> {\n const action = this.action();\n if (!action || action.kind === 'codes') return Promise.resolve();\n return this.run(async () => {\n await this.api.configure(action.method.method_id, email);\n this.enrollEmail.set(email);\n this.step.set('enroll-email-code');\n });\n }\n\n confirmEnroll(code: string): Promise<void> {\n const action = this.action();\n if (!action || action.kind === 'codes' || action.kind === 'remove' || !/^\\d{6}$/.test(code)) return Promise.resolve();\n return this.run(async () => {\n const overview = await this.api.register(action.method.method_id, code);\n this.apply(overview);\n this.totpSetup.set(null);\n if (overview.recovery_codes_issued?.length) {\n // Primeiro método: os códigos aparecem uma vez, na linha deles.\n this.action.set({ kind: 'codes' });\n this.owner.set('codes');\n this.issuedCodes.set(overview.recovery_codes_issued);\n this.step.set('codes');\n return;\n }\n this.finish(action.kind === 'replace' ? 'deviceReplaced' : 'methodAdded');\n });\n }\n\n confirmRemove(): Promise<void> {\n const action = this.action();\n if (!action || action.kind !== 'remove') return Promise.resolve();\n return this.run(async () => {\n this.apply(await this.api.remove(action.method.method_id));\n this.finish('methodRemoved');\n });\n }\n\n codesSaved(): void {\n this.issuedCodes.set(null);\n this.finish('codesRegenerated');\n }\n\n private finish(notice: AccountNotice): void {\n this.action.set(null);\n this.step.set('idle');\n this.notice.set(notice);\n }\n\n private apply(overview: AccountOverview): void {\n this.overview.set(overview);\n if (overview.reauthenticated) this.reauthUntil = Date.now() + overview.reauth_expires_in * 1000;\n }\n\n private async refresh(): Promise<void> {\n try {\n this.apply(await this.api.overview());\n } catch {\n // A ação já foi feita; a contagem volta certa na próxima abertura do painel.\n }\n }\n\n /** Executa uma chamada com o estado de ocupado e o erro na tela. A reautenticação vencida no meio volta\n * para a prova de identidade (e a ação continua depois dela). */\n private async run(fn: () => Promise<void>): Promise<void> {\n if (this.busy()) return;\n this.busy.set(true);\n this.error.set('');\n try {\n await fn();\n } catch (err) {\n const code = accountErrorCode(err) || 'generic';\n if (code === 'reauthentication_required') {\n this.reauthUntil = 0;\n this.openReauth();\n }\n this.error.set(code);\n } finally {\n this.busy.set(false);\n }\n }\n}\n\n/**\n * Escopo do estado da conta: no `hm-settings-section` da \"Conta e segurança\", para as linhas da seção\n * (métodos e códigos de recuperação) dividirem o mesmo estado e ele morrer junto com o painel.\n */\n@Directive({\n selector: '[spineAccountSecurity]',\n providers: [SpineAccountSecurityState],\n})\nexport class SpineAccountSecurityScopeDirective {}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ButtonComponent, CodeInputComponent, InputComponent, RadioComponent, RadioOption } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineAccountSecurityState, isEmail, isSms, isTotp } from './account-security.state';\n\nlet sequence = 0;\n\n/**\n * Prova de identidade antes de uma alteração na conta (senha, código do autenticador, código enviado ao\n * e-mail cadastrado ou código de recuperação). Vale 5 minutos no Argos, presa à sessão do login; depois\n * dela a ação pedida continua sozinha (`SpineAccountSecurityState.confirmReauth`).\n */\n@Component({\n selector: 'spine-account-reauth',\n imports: [ReactiveFormsModule, ButtonComponent, CodeInputComponent, InputComponent, RadioComponent],\n template: `\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"titleId\">\n <h4 class=\"sp-account__title\" [id]=\"titleId\">{{ t.reauthTitle }}</h4>\n <p class=\"sp-account__hint\">{{ t.reauthHint }}</p>\n\n @if (choices().length > 1) {\n <hm-radio layout=\"inline\" [label]=\"t.reauthHow\" [options]=\"choices()\" [value]=\"state.reauthMode()\" (valueChange)=\"choose($event)\" />\n }\n\n @switch (kind()) {\n @case ('password') {\n <form class=\"sp-account__form\" (submit)=\"$event.preventDefault(); submitPassword()\">\n <hm-input type=\"password\" autocomplete=\"current-password\" [label]=\"t.currentPassword\" [formControl]=\"password\" [messages]=\"{ required: t.passwordRequired }\" />\n <div class=\"sp-account__actions\">\n <hm-button type=\"submit\" emphasis=\"high\" [loading]=\"state.busy()\">{{ t.confirm }}</hm-button>\n <hm-button emphasis=\"minimal\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </form>\n }\n @case ('recovery') {\n <form class=\"sp-account__form\" (submit)=\"$event.preventDefault(); submitRecovery()\">\n <hm-input autocomplete=\"off\" [label]=\"t.recoveryCode\" [placeholder]=\"t.recoveryCodePlaceholder\" [formControl]=\"recoveryCode\"\n [messages]=\"{ required: t.recoveryCodeRequired, minlength: t.recoveryCodeLength }\" />\n <div class=\"sp-account__actions\">\n <hm-button type=\"submit\" emphasis=\"high\" [loading]=\"state.busy()\">{{ t.confirm }}</hm-button>\n <hm-button emphasis=\"minimal\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </form>\n }\n @case ('email-request') {\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"high\" icon=\"mail\" [loading]=\"state.busy()\" (clicked)=\"state.sendReauthCode()\">{{ t.sendEmailCode }}</hm-button>\n <hm-button emphasis=\"minimal\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n }\n @default {\n <div class=\"sp-account__code\" role=\"group\" [attr.aria-labelledby]=\"codeLabelId\">\n <span class=\"sp-account__label\" [id]=\"codeLabelId\">{{ t.sixDigitCode }}</span>\n <hm-code-input (completed)=\"submitCode($event)\" />\n </div>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"minimal\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n }\n }\n </section>\n `,\n styleUrl: './account-security.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountReauthComponent {\n protected readonly state = inject(SpineAccountSecurityState);\n protected readonly t = inject(SPINE_MESSAGES).accountSecurity;\n protected readonly titleId = `sp-account-reauth-${++sequence}`;\n protected readonly codeLabelId = `${this.titleId}-code`;\n\n protected readonly password = new FormControl('', { nonNullable: true, validators: [Validators.required] });\n protected readonly recoveryCode = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.minLength(10)] });\n\n /** Senha, os métodos ativos que servem de prova (o SMS não tem envio) e, com códigos restantes, um código de recuperação. */\n protected readonly choices = computed<RadioOption[]>(() => {\n const options: RadioOption[] = [{ value: 'password', label: this.t.reauthPassword }];\n for (const m of this.state.activeMethods()) {\n if (isSms(m)) continue;\n options.push({ value: m.method_id, label: isTotp(m) ? this.t.methodTotp : isEmail(m) ? this.t.methodEmail : m.method_name });\n }\n if (this.state.activeMethods().length && this.state.remainingCodes() > 0) {\n options.push({ value: this.state.recoveryMethodId(), label: this.t.reauthRecoveryCode });\n }\n return options;\n });\n\n protected readonly kind = computed<'password' | 'recovery' | 'email-request' | 'code'>(() => {\n const mode = this.state.reauthMode();\n if (mode === 'password') return 'password';\n if (mode === this.state.recoveryMethodId()) return 'recovery';\n const method = this.state.activeMethods().find((m) => m.method_id === mode);\n return isEmail(method) && !this.state.reauthCodeSent() ? 'email-request' : 'code';\n });\n\n protected choose(mode: string | null): void {\n if (mode) this.state.chooseReauth(mode);\n }\n\n protected submitPassword(): void {\n this.password.markAsTouched();\n if (this.password.invalid) return;\n void this.state.confirmReauth({ password: this.password.value });\n }\n\n protected submitRecovery(): void {\n this.recoveryCode.markAsTouched();\n if (this.recoveryCode.invalid) return;\n void this.state.confirmReauth({ method_id: this.state.reauthMode(), code: this.recoveryCode.value.trim() });\n }\n\n protected submitCode(code: string): void {\n void this.state.confirmReauth({ method_id: this.state.reauthMode(), code });\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { AlertComponent, ButtonComponent, CodeInputComponent, IconComponent, InputComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { AccountMethod } from './account-security.service';\nimport { SpineAccountSecurityState, isEmail, isSms, isTotp } from './account-security.state';\nimport { AccountReauthComponent } from './account-reauth.component';\n\nlet sequence = 0;\n\n/**\n * Verificação em duas etapas da conta no Argos, dentro do painel de configurações: os métodos (ativo,\n * não cadastrado, indisponível) e as ações — adicionar (TOTP com QR Code e confirmação pelo código; e-mail\n * com código no endereço informado), trocar o aparelho do autenticador e remover. Cada ação passa antes pela\n * reautenticação (`spine-account-reauth`).\n */\n@Component({\n selector: 'spine-account-mfa',\n imports: [ReactiveFormsModule, AlertComponent, ButtonComponent, CodeInputComponent, IconComponent, InputComponent, AccountReauthComponent],\n templateUrl: './account-mfa.component.html',\n styleUrl: './account-security.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountMfaComponent {\n protected readonly state = inject(SpineAccountSecurityState);\n protected readonly t = inject(SPINE_MESSAGES).accountSecurity;\n protected readonly fmt = formatMessage;\n protected readonly isTotp = isTotp;\n protected readonly isSms = isSms;\n protected readonly ids = `sp-account-mfa-${++sequence}`;\n\n protected readonly email = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.email] });\n\n protected label(method: AccountMethod | null | undefined): string {\n if (!method) return '';\n if (isTotp(method)) return this.t.methodTotp;\n if (isEmail(method)) return this.t.methodEmail;\n if (isSms(method)) return this.t.methodSms;\n return method.method_name;\n }\n\n protected icon(method: AccountMethod): string {\n return isTotp(method) ? 'authenticator' : isEmail(method) ? 'mail' : 'sms';\n }\n\n protected status(method: AccountMethod): string {\n if (isSms(method)) return this.t.unavailable;\n if (!method.active) return this.t.notRegistered;\n return method.secret ? formatMessage(this.t.activeWithDetail, { detail: method.secret }) : this.t.active;\n }\n\n /** Método da ação em andamento (para o título \"Remover ...?\"). */\n protected actionMethod(): AccountMethod | null {\n const action = this.state.action();\n return action && action.kind !== 'codes' ? action.method : null;\n }\n\n protected errorText(code: string): string {\n return (this.t.errors as Record<string, string>)[code] ?? this.t.errors.generic;\n }\n\n protected startAdd(method: AccountMethod): void {\n this.email.reset('');\n this.state.start({ kind: 'add', method });\n }\n\n protected sendEmail(): void {\n this.email.markAsTouched();\n if (this.email.invalid) return;\n void this.state.sendEnrollEmail(this.email.value.trim());\n }\n}\n","@if (state.loading() && !state.overview()) {\n <p class=\"sp-account__hint\" role=\"status\">{{ t.loading }}</p>\n} @else if (state.loadError()) {\n <hm-alert variant=\"error\">{{ errorText(state.loadError()) }}</hm-alert>\n @if (state.loadError() !== 'login_required' && state.loadError() !== 'invalid_token') {\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"medium\" icon=\"refresh\" (clicked)=\"state.load()\">{{ t.retry }}</hm-button>\n </div>\n }\n} @else if (state.overview(); as data) {\n @if (state.owner() === 'methods') {\n @if (state.notice(); as notice) {\n <hm-alert variant=\"success\">{{ t.notices[notice] }}</hm-alert>\n }\n @if (state.error(); as error) {\n <hm-alert variant=\"error\">{{ errorText(error) }}</hm-alert>\n }\n }\n\n @if (state.owner() === 'methods' && state.step() !== 'idle') {\n @switch (state.step()) {\n @case ('reauth') {\n <spine-account-reauth />\n }\n\n @case ('confirm-remove') {\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"ids + '-remove'\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-remove'\">{{ fmt(t.removeTitle, { method: label(actionMethod()) }) }}</h4>\n <p class=\"sp-account__hint\">\n {{ t.removeHint }}\n @if (state.activeMethods().length <= 1) { {{ t.removeLastHint }} }\n </p>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"high\" intent=\"danger\" [loading]=\"state.busy()\" (clicked)=\"state.confirmRemove()\">{{ t.remove }}</hm-button>\n <hm-button emphasis=\"minimal\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </section>\n }\n\n @case ('enroll-totp') {\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"ids + '-totp'\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-totp'\">{{ t.totpTitle }}</h4>\n @if (state.totpSetup(); as setup) {\n @if (setup.qrcode) {\n <div class=\"sp-account__qr\"><img [src]=\"setup.qrcode\" [alt]=\"t.qrAlt\" /></div>\n }\n <p class=\"sp-account__hint\">{{ t.manualKey }} <code class=\"sp-account__secret\">{{ setup.secret }}</code></p>\n }\n <div class=\"sp-account__code\" role=\"group\" [attr.aria-labelledby]=\"ids + '-totp-code'\">\n <span class=\"sp-account__label\" [id]=\"ids + '-totp-code'\">{{ t.appCode }}</span>\n <hm-code-input (completed)=\"state.confirmEnroll($event)\" />\n </div>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"minimal\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </section>\n }\n\n @case ('enroll-email') {\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"ids + '-email'\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-email'\">{{ t.emailTitle }}</h4>\n <form class=\"sp-account__form\" (submit)=\"$event.preventDefault(); sendEmail()\">\n <hm-input type=\"email\" autocomplete=\"email\" [label]=\"t.email\" [placeholder]=\"t.emailPlaceholder\" [formControl]=\"email\"\n [messages]=\"{ required: t.emailRequired, email: t.emailInvalid }\" />\n <div class=\"sp-account__actions\">\n <hm-button type=\"submit\" emphasis=\"high\" icon=\"mail\" [loading]=\"state.busy()\">{{ t.sendCode }}</hm-button>\n <hm-button emphasis=\"minimal\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </form>\n </section>\n }\n\n @case ('enroll-email-code') {\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"ids + '-email-code'\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-email-code'\">{{ t.emailCodeTitle }}</h4>\n <p class=\"sp-account__hint\" [id]=\"ids + '-email-code-hint'\">{{ fmt(t.emailCodeHint, { email: state.enrollEmail() }) }}</p>\n <div class=\"sp-account__code\" role=\"group\" [attr.aria-labelledby]=\"ids + '-email-code-label'\" [attr.aria-describedby]=\"ids + '-email-code-hint'\">\n <span class=\"sp-account__label\" [id]=\"ids + '-email-code-label'\">{{ t.sixDigitCode }}</span>\n <hm-code-input (completed)=\"state.confirmEnroll($event)\" />\n </div>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"minimal\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </section>\n }\n }\n } @else {\n @if (data.policy.required) {\n <p class=\"sp-account__hint\">{{ t.requiredHint }}</p>\n }\n <ul class=\"sp-account__list\">\n @for (m of state.methods(); track m.method_id) {\n <li class=\"sp-account__item\">\n <span class=\"sp-account__icon\"><hm-icon [shape]=\"icon(m)\" /></span>\n <span class=\"sp-account__item-main\">\n <strong>{{ label(m) }}</strong>\n <span class=\"sp-account__meta\">{{ status(m) }}</span>\n </span>\n @if (!isSms(m)) {\n <span class=\"sp-account__item-actions\">\n @if (!m.active) {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"plus\" [disabled]=\"state.busy() || state.step() !== 'idle'\" (clicked)=\"startAdd(m)\">{{ t.add }}</hm-button>\n } @else {\n @if (isTotp(m)) {\n <hm-button size=\"small\" emphasis=\"medium\" [disabled]=\"state.busy() || state.step() !== 'idle'\" (clicked)=\"state.start({ kind: 'replace', method: m })\">{{ t.replaceDevice }}</hm-button>\n }\n <hm-button size=\"small\" emphasis=\"minimal\" intent=\"danger\" [disabled]=\"state.busy() || state.step() !== 'idle' || !state.canRemove(m)\" (clicked)=\"state.start({ kind: 'remove', method: m })\">{{ t.remove }}</hm-button>\n }\n </span>\n }\n </li>\n }\n </ul>\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { AlertComponent, ButtonComponent, HermesToastService } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { pluralMessage } from '@trismegisto/primitives';\nimport { SpineAccountSecurityState } from './account-security.state';\nimport { AccountReauthComponent } from './account-reauth.component';\n\nlet sequence = 0;\n\n/**\n * Códigos de recuperação da conta no Argos: quantos restam e \"gerar novos\" (com reautenticação). O lote\n * novo aparece UMA vez (o Argos só guarda o hash), com copiar e baixar em .txt, até a pessoa dizer que\n * guardou — e some quando o painel fecha.\n */\n@Component({\n selector: 'spine-account-recovery-codes',\n imports: [AlertComponent, ButtonComponent, AccountReauthComponent],\n template: `\n @if (state.overview()) {\n @if (state.owner() === 'codes') {\n @if (state.notice(); as notice) {\n <hm-alert variant=\"success\">{{ t.notices[notice] }}</hm-alert>\n }\n @if (state.error(); as error) {\n <hm-alert variant=\"error\">{{ errorText(error) }}</hm-alert>\n }\n }\n\n @if (state.owner() === 'codes' && state.step() === 'reauth') {\n <spine-account-reauth />\n } @else if (state.owner() === 'codes' && state.step() === 'codes' && state.issuedCodes(); as codes) {\n <section class=\"sp-account__panel sp-account__panel--success\" [attr.aria-labelledby]=\"titleId\">\n <h4 class=\"sp-account__title\" [id]=\"titleId\">{{ t.codesTitle }}</h4>\n <p class=\"sp-account__hint\">{{ t.codesShownOnce }}</p>\n <ol class=\"sp-account__codes\">\n @for (code of codes; track code) {\n <li><code>{{ code }}</code></li>\n }\n </ol>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"medium\" icon=\"copy\" (clicked)=\"copy(codes)\">{{ t.copyCodes }}</hm-button>\n <hm-button emphasis=\"medium\" icon=\"download\" (clicked)=\"download(codes)\">{{ t.downloadCodes }}</hm-button>\n <hm-button emphasis=\"high\" (clicked)=\"state.codesSaved()\">{{ t.codesSaved }}</hm-button>\n </div>\n </section>\n } @else if (state.activeMethods().length) {\n <p class=\"sp-account__hint\">{{ remaining() }} {{ t.codesHint }}</p>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"medium\" icon=\"key\" [disabled]=\"state.busy() || state.step() !== 'idle'\" (clicked)=\"state.start({ kind: 'codes' })\">\n {{ state.remainingCodes() ? t.regenerateCodes : t.generateCodes }}\n </hm-button>\n </div>\n } @else {\n <p class=\"sp-account__hint\">{{ t.codesNeedMethod }}</p>\n }\n }\n `,\n styleUrl: './account-security.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountRecoveryCodesComponent {\n protected readonly state = inject(SpineAccountSecurityState);\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly t = this.messages.accountSecurity;\n private readonly toast = inject(HermesToastService);\n protected readonly titleId = `sp-account-codes-${++sequence}`;\n\n protected readonly remaining = computed(() =>\n pluralMessage(this.t.codesRemaining, this.state.remainingCodes(), this.messages.meta.locale));\n\n protected errorText(code: string): string {\n return (this.t.errors as Record<string, string>)[code] ?? this.t.errors.generic;\n }\n\n private asText(codes: readonly string[]): string {\n return `${this.t.codesFileHeader}\\n\\n${codes.join('\\n')}\\n`;\n }\n\n protected async copy(codes: readonly string[]): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.asText(codes));\n this.toast.success(this.t.codesCopied);\n } catch {\n this.toast.error(this.t.copyFailed);\n }\n }\n\n protected download(codes: readonly string[]): void {\n const url = URL.createObjectURL(new Blob([this.asText(codes)], { type: 'text/plain;charset=utf-8' }));\n const a = document.createElement('a');\n a.href = url;\n a.download = this.t.codesFileName;\n a.click();\n // Revogar no mesmo tick pode cancelar o download em alguns navegadores (o clique só agenda a navegação).\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { AlertComponent, ButtonComponent, IconComponent, TagComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES, SpinePreferencesService } from '@trismegisto/spine';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives';\nimport { AccountSession, SpineAccountSecurityService, accountErrorCode } from './account-security.service';\n\n/**\n * Sessões e dispositivos da conta no Argos, dentro do painel de configurações: onde a conta está\n * conectada (navegador, IP, aplicativos, último uso), com a sessão deste login marcada. Encerra uma\n * sessão (segundo clique confirma) ou todas as outras. A sessão atual não tem \"Encerrar\" aqui: sair dela é\n * o \"Sair\" da seção Conta, que também encerra o app.\n */\n@Component({\n selector: 'spine-account-sessions',\n imports: [AlertComponent, ButtonComponent, IconComponent, TagComponent],\n templateUrl: './account-sessions.component.html',\n styleUrl: './account-security.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountSessionsComponent {\n private readonly api = inject(SpineAccountSecurityService);\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly t = this.messages.accountSecurity;\n private readonly preferences = inject(SpinePreferencesService);\n\n protected readonly loading = signal(true);\n protected readonly loadError = signal('');\n protected readonly sessions = signal<AccountSession[]>([]);\n protected readonly notice = signal('');\n protected readonly error = signal('');\n /** Encerramento aguardando o segundo clique: id da sessão, `others` ou null. */\n protected readonly confirming = signal<string | null>(null);\n protected readonly busy = signal(false);\n\n /** A deste login primeiro; depois as outras, da usada mais recentemente. */\n protected readonly ordered = computed(() =>\n [...this.sessions()].sort((a, b) => Number(b.current) - Number(a.current) || b.last_seen_at.localeCompare(a.last_seen_at)));\n protected readonly others = computed(() => this.sessions().filter((s) => !s.current).length);\n protected readonly othersConfirm = computed(() =>\n pluralMessage(this.t.endOthersConfirm, this.others(), this.messages.meta.locale));\n\n constructor() {\n if (this.api.available) void this.load();\n else this.loading.set(false);\n }\n\n protected async load(): Promise<void> {\n this.loading.set(true);\n try {\n const { sessions } = await this.api.sessions();\n this.sessions.set(sessions ?? []);\n this.loadError.set('');\n } catch (err) {\n this.loadError.set(accountErrorCode(err) || 'generic');\n } finally {\n this.loading.set(false);\n }\n }\n\n protected ask(target: string): void {\n this.notice.set('');\n this.error.set('');\n this.confirming.set(target);\n }\n\n protected cancel(): void {\n this.confirming.set(null);\n }\n\n protected async end(session: AccountSession): Promise<void> {\n if (this.confirming() !== session.id) {\n this.ask(session.id);\n return;\n }\n await this.run(async () => {\n await this.api.endSession(session.id);\n this.notice.set(this.t.sessionEndedNotice);\n });\n }\n\n protected async endOthers(): Promise<void> {\n await this.run(async () => {\n const { ended } = await this.api.endOtherSessions();\n this.notice.set(pluralMessage(this.t.othersEndedNotice, ended, this.messages.meta.locale));\n });\n }\n\n private async run(fn: () => Promise<void>): Promise<void> {\n if (this.busy()) return;\n this.busy.set(true);\n this.error.set('');\n try {\n await fn();\n } catch (err) {\n const code = accountErrorCode(err) || 'generic';\n if (code === 'login_required' || code === 'invalid_token') {\n this.loadError.set(code);\n } else {\n this.error.set(this.errorText(code));\n }\n } finally {\n this.confirming.set(null);\n this.busy.set(false);\n }\n if (!this.loadError()) await this.load();\n }\n\n protected errorText(code: string): string {\n return (this.t.errors as Record<string, string>)[code] ?? this.t.errors.generic;\n }\n\n protected detail(session: AccountSession): string {\n return formatMessage(this.t.sessionDetail, { ip: session.ip || this.t.unknownIp, date: this.date(session.last_seen_at) });\n }\n\n protected since(session: AccountSession): string {\n return formatMessage(this.t.sessionSince, { date: this.date(session.created_at) });\n }\n\n protected apps(session: AccountSession): string {\n return formatMessage(this.t.sessionApps, { apps: session.clients.map((c) => c.name ?? this.t.unnamedApp).join(', ') });\n }\n\n private date(value: string): string {\n return new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() })\n .format(new Date(value));\n }\n}\n","@if (loading() && !sessions().length) {\n <p class=\"sp-account__hint\" role=\"status\">{{ t.loading }}</p>\n} @else if (loadError()) {\n <hm-alert variant=\"error\">{{ errorText(loadError()) }}</hm-alert>\n @if (loadError() !== 'login_required' && loadError() !== 'invalid_token') {\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"medium\" icon=\"refresh\" (clicked)=\"load()\">{{ t.retry }}</hm-button>\n </div>\n }\n} @else {\n @if (notice()) {\n <hm-alert variant=\"success\">{{ notice() }}</hm-alert>\n }\n @if (error()) {\n <hm-alert variant=\"error\">{{ error() }}</hm-alert>\n }\n\n <ul class=\"sp-account__list\">\n @for (s of ordered(); track s.id) {\n <li class=\"sp-account__item\">\n <span class=\"sp-account__icon\"><hm-icon [shape]=\"s.device.mobile ? 'mobile' : 'computer'\" /></span>\n <span class=\"sp-account__item-main\">\n <span class=\"sp-account__item-title\">\n <strong>{{ s.device.label }}</strong>\n @if (s.current) {\n <hm-tag [name]=\"t.thisSession\" color=\"success\" />\n } @else if (s.this_device) {\n <hm-tag [name]=\"t.thisBrowser\" color=\"info\" />\n }\n @if (!s.sso_active) {\n <hm-tag [name]=\"t.appsOnly\" color=\"warning\" />\n }\n </span>\n <span class=\"sp-account__meta\">{{ detail(s) }}</span>\n <span class=\"sp-account__meta\">{{ since(s) }}</span>\n @if (s.clients.length) {\n <span class=\"sp-account__meta\">{{ apps(s) }}</span>\n }\n </span>\n @if (!s.current) {\n <span class=\"sp-account__item-actions\">\n @if (confirming() === s.id) {\n <hm-button size=\"small\" emphasis=\"minimal\" [disabled]=\"busy()\" (clicked)=\"cancel()\">{{ t.cancel }}</hm-button>\n }\n <hm-button size=\"small\" [emphasis]=\"confirming() === s.id ? 'high' : 'medium'\" intent=\"danger\" [loading]=\"busy() && confirming() === s.id\" [disabled]=\"busy() && confirming() !== s.id\" (clicked)=\"end(s)\">\n {{ confirming() === s.id ? t.confirmEndSession : t.endSession }}\n </hm-button>\n </span>\n }\n </li>\n } @empty {\n <li class=\"sp-account__item sp-account__meta\">{{ t.sessionsEmpty }}</li>\n }\n </ul>\n\n @if (others() > 0) {\n @if (confirming() === 'others') {\n <p class=\"sp-account__hint\">{{ othersConfirm() }}</p>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"high\" intent=\"danger\" icon=\"logout\" [loading]=\"busy()\" (clicked)=\"endOthers()\">{{ t.endOthers }}</hm-button>\n <hm-button emphasis=\"minimal\" [disabled]=\"busy()\" (clicked)=\"cancel()\">{{ t.cancel }}</hm-button>\n </div>\n } @else {\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"medium\" icon=\"logout\" [disabled]=\"busy()\" (clicked)=\"ask('others')\">{{ t.endOthers }}</hm-button>\n </div>\n }\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { SPINE_ADMIN_API } from '@trismegisto/spine';\nimport { urlPath } from '@trismegisto/primitives';\n\n/** Um token de aplicação do usuário, como o argos-admin devolve (nunca o valor, só o prefixo). */\nexport interface AppToken {\n id: string;\n name: string;\n description: string | null;\n prefix: string;\n badge_id: string;\n badge_name: string;\n expires_at: string;\n created_at: string;\n last_used_at: string | null;\n expired: boolean;\n}\n\nexport interface AppTokenList {\n tokens: AppToken[];\n max_active: number;\n max_days: number;\n}\n\n/** A aplicação logada e os níveis de acesso que o usuário pode escolher nela ao criar um token. */\nexport interface AppTokenOptions {\n client: { id: string; name: string | null };\n badges: { id: string; name: string }[];\n max_days: number;\n}\n\nexport interface CreatedAppToken {\n id: string;\n /** Valor bruto — só existe nesta resposta. */\n token: string;\n expires_at: string;\n}\n\n/**\n * Tokens de aplicação pessoais (`x-app-token`) do usuário logado — `argos-admin /me/app-tokens`.\n * Sempre da aplicação LOGADA: o servidor tira o client do próprio access-token da sessão, então\n * aqui não existe escolha de aplicação.\n * Autentica com o access-token da sessão (o servidor recusa um app-token aqui: token não cria\n * token). `available` é falso quando o app não tem a URL do argos-admin (`SPINE_ADMIN_API`).\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineAppTokensService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n private readonly adminApi = inject(SPINE_ADMIN_API, { optional: true });\n\n readonly available = !!this.adminApi;\n\n private get baseUrl(): string {\n return `${this.adminApi}/me/app-tokens`;\n }\n\n private get headers(): HttpHeaders {\n return new HttpHeaders({ 'x-access-token': this.auth.getToken() ?? '' });\n }\n\n list(): Promise<AppTokenList> {\n return firstValueFrom(this.http.get<AppTokenList>(this.baseUrl, { headers: this.headers }));\n }\n\n options(): Promise<AppTokenOptions> {\n return firstValueFrom(this.http.get<AppTokenOptions>(`${this.baseUrl}/options`, { headers: this.headers }));\n }\n\n create(body: { badge_id: string; name: string; validity_days: number }): Promise<CreatedAppToken> {\n return firstValueFrom(this.http.post<CreatedAppToken>(this.baseUrl, body, { headers: this.headers }));\n }\n\n revoke(id: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(`${this.baseUrl}${urlPath`/${id}`}`, { headers: this.headers }));\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { FormControl, Validators, ReactiveFormsModule } from '@angular/forms';\nimport {\n ButtonComponent,\n InputComponent,\n HermesToastService,\n IconComponent,\n SegmentedControlComponent,\n SegmentedOption,\n} from '@trismegisto/angular';\nimport { SpinePreferencesService, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AppToken, SpineAppTokensService } from './app-tokens.service';\nimport { formatMessage, formatMessageHtml } from '@trismegisto/primitives';\n\n/** Validades oferecidas (dias). O servidor recusa acima de 365 — o CHECK no banco também. */\n\n/**\n * Tokens de aplicação do usuário (seção Conta do painel de configurações): lista, criação e\n * revogação. O valor do token só aparece uma vez, logo depois de criado, e some quando o painel\n * fecha (o componente vive dentro do `@if` do painel).\n */\n@Component({\n selector: 'spine-app-tokens',\n imports: [ReactiveFormsModule, ButtonComponent, InputComponent, IconComponent, SegmentedControlComponent],\n templateUrl: './app-tokens.component.html',\n styleUrl: './app-tokens.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppTokensComponent {\n protected readonly text = inject(SPINE_MESSAGES).appTokens;\n protected readonly fmt = formatMessage;\n /** Para `[innerHTML]`: escapa os parâmetros (o nome da aplicação vem do servidor). */\n protected readonly fmtHtml = formatMessageHtml;\n private readonly locale = inject(SPINE_MESSAGES);\n private readonly service = inject(SpineAppTokensService);\n private readonly toast = inject(HermesToastService);\n private readonly preferences = inject(SpinePreferencesService);\n\n protected readonly available = this.service.available;\n protected readonly loading = signal(true);\n protected readonly loadError = signal('');\n protected readonly tokens = signal<AppToken[]>([]);\n protected readonly maxActive = signal(10);\n\n protected readonly validCount = computed(() => this.tokens().filter((t) => !t.expired).length);\n protected readonly atLimit = computed(() => this.validCount() >= this.maxActive());\n\n // ── criação ─────────────────────────────────────────────────────────────────\n protected readonly creating = signal(false);\n protected readonly submitting = signal(false);\n /** Nome da aplicação logada (a única para a qual dá pra criar token aqui). */\n protected readonly clientName = signal('');\n protected readonly badges = signal<{ id: string; name: string }[]>([]);\n protected readonly badgeId = signal('');\n protected readonly validity = signal('90');\n protected readonly nameControl = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.maxLength(80)] });\n protected readonly validityOptions = computed<readonly SegmentedOption[]>(() => [\n { value: '30', label: this.text.days30 },\n { value: '90', label: this.text.days90 },\n { value: '180', label: this.text.months6 },\n { value: '365', label: this.text.year1 },\n ]);\n\n protected readonly badgeOptions = computed<SegmentedOption[]>(() =>\n this.badges().map((b) => ({ value: b.id, label: b.name })),\n );\n\n /** Token recém-criado, mostrado uma única vez. */\n protected readonly created = signal<{ name: string; token: string; expiresAt: string } | null>(null);\n /** Token com a revogação aguardando confirmação (segundo clique). */\n protected readonly confirmingRevoke = signal<string | null>(null);\n\n constructor() {\n if (this.available) void this.load();\n else this.loading.set(false);\n }\n\n private async load(): Promise<void> {\n this.loading.set(true);\n this.loadError.set('');\n try {\n const list = await this.service.list();\n this.tokens.set(list.tokens);\n this.maxActive.set(list.max_active);\n } catch (err) {\n this.loadError.set(this.errorText(err, this.text.loadError));\n } finally {\n this.loading.set(false);\n }\n }\n\n protected async startCreate(): Promise<void> {\n this.created.set(null);\n this.nameControl.reset('');\n this.validity.set('90');\n this.creating.set(true);\n try {\n const { client, badges } = await this.service.options();\n this.clientName.set(client.name ?? '');\n this.badges.set(badges);\n // Um nível só: já vem escolhido. Vários: o de maior nível vem primeiro (ordem do servidor).\n this.badgeId.set(badges[0]?.id ?? '');\n } catch (err) {\n this.toast.error(this.errorText(err, this.text.badgesError));\n this.creating.set(false);\n }\n }\n\n protected cancelCreate(): void {\n this.creating.set(false);\n }\n\n protected readonly canSubmit = computed(() => !!this.badgeId() && !this.submitting());\n\n protected async submit(): Promise<void> {\n this.nameControl.markAsTouched();\n if (!this.canSubmit() || this.nameControl.invalid) return;\n this.submitting.set(true);\n try {\n const name = this.nameControl.value.trim();\n const result = await this.service.create({\n badge_id: this.badgeId(),\n name,\n validity_days: Number(this.validity()),\n });\n this.created.set({ name, token: result.token, expiresAt: result.expires_at });\n this.creating.set(false);\n await this.load();\n } catch (err) {\n this.toast.error(this.errorText(err, this.text.createError));\n } finally {\n this.submitting.set(false);\n }\n }\n\n protected async copyCreated(): Promise<void> {\n const token = this.created()?.token;\n if (!token) return;\n try {\n await navigator.clipboard.writeText(token);\n this.toast.success(this.text.copied);\n } catch {\n this.toast.error(this.text.copyFailed);\n }\n }\n\n protected dismissCreated(): void {\n this.created.set(null);\n }\n\n protected async revoke(token: AppToken): Promise<void> {\n if (this.confirmingRevoke() !== token.id) {\n this.confirmingRevoke.set(token.id);\n return;\n }\n this.confirmingRevoke.set(null);\n try {\n await this.service.revoke(token.id);\n this.tokens.update((list) => list.filter((t) => t.id !== token.id));\n this.toast.success(formatMessage(this.text.revoked, { name: token.name }));\n } catch (err) {\n this.toast.error(this.errorText(err, this.text.revokeError));\n }\n }\n\n protected formatDate(value: string | null): string {\n if (!value) return this.text.never;\n return new Intl.DateTimeFormat(this.locale.meta.locale, { dateStyle: 'short', timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() })\n .format(new Date(value));\n }\n\n private errorText(err: unknown, fallback: string): string {\n const detail = err instanceof HttpErrorResponse ? (err.error?.detail as string | undefined) : undefined;\n return detail || fallback;\n }\n}\n","@if (!available) {\n <p class=\"sp-tokens__note\">{{ text.unavailable }}</p>\n} @else {\n <!-- Token recém-criado: única vez em que o valor aparece. -->\n @if (created(); as c) {\n <div class=\"sp-tokens__created\" role=\"status\">\n <p class=\"sp-tokens__created-title\">\n <hm-icon shape=\"check-circle\" /> {{ fmt(text.created, { name: c.name }) }}\n </p>\n <code class=\"sp-tokens__secret\">{{ c.token }}</code>\n <p class=\"sp-tokens__note\" [innerHTML]=\"fmtHtml(text.sendHeader, { date: formatDate(c.expiresAt) })\"></p>\n <div class=\"sp-tokens__actions\">\n <hm-button emphasis=\"high\" icon=\"copy\" (clicked)=\"copyCreated()\">{{ text.copyToken }}</hm-button>\n <hm-button emphasis=\"minimal\" (clicked)=\"dismissCreated()\">{{ text.saved }}</hm-button>\n </div>\n </div>\n }\n\n @if (loading()) {\n <p class=\"sp-tokens__note\">{{ text.loading }}</p>\n } @else if (loadError()) {\n <p class=\"sp-tokens__note sp-tokens__note--error\">{{ loadError() }}</p>\n } @else {\n @if (tokens().length) {\n <ul class=\"sp-tokens__list\">\n @for (t of tokens(); track t.id) {\n <li class=\"sp-tokens__item\" [class.sp-tokens__item--expired]=\"t.expired\">\n <span class=\"sp-tokens__item-main\">\n <strong>{{ t.name }}</strong>\n <span class=\"sp-tokens__meta\">{{ t.badge_name }} · <code>{{ t.prefix }}</code></span>\n <span class=\"sp-tokens__meta\">\n @if (t.expired) { <span class=\"sp-tokens__expired\">{{ fmt(text.expiredOn, { date: formatDate(t.expires_at) }) }}</span> }\n @else { {{ fmt(text.expiresOn, { date: formatDate(t.expires_at) }) }} }\n · {{ fmt(text.lastUsed, { date: formatDate(t.last_used_at) }) }}\n </span>\n </span>\n <hm-button emphasis=\"minimal\" intent=\"danger\" (clicked)=\"revoke(t)\">\n {{ confirmingRevoke() === t.id ? text.confirmRevoke : text.revoke }}\n </hm-button>\n </li>\n }\n </ul>\n } @else if (!creating()) {\n <p class=\"sp-tokens__note\">{{ text.empty }}</p>\n }\n\n @if (creating()) {\n <form class=\"sp-tokens__form\" (submit)=\"$event.preventDefault(); submit()\">\n @if (!badges().length) {\n <p class=\"sp-tokens__note\">{{ text.noBadges }}</p>\n } @else {\n @if (clientName()) {\n <p class=\"sp-tokens__note\" [innerHTML]=\"fmtHtml(text.appOnly, { name: clientName() })\"></p>\n }\n @if (badgeOptions().length > 1) {\n <div class=\"sp-tokens__field\">\n <span class=\"sp-tokens__label\">{{ text.accessLevel }}</span>\n <hm-segmented-control emphasis=\"action\" [label]=\"text.accessLevel\" [options]=\"badgeOptions()\" [value]=\"badgeId()\" (valueChange)=\"badgeId.set($event)\" />\n </div>\n }\n <hm-input [label]=\"text.name\" [placeholder]=\"text.namePlaceholder\" [formControl]=\"nameControl\" [messages]=\"{ required: text.nameRequired, maxlength: text.nameMax }\" />\n <div class=\"sp-tokens__field\">\n <span class=\"sp-tokens__label\">{{ text.validity }}</span>\n <hm-segmented-control emphasis=\"action\" [label]=\"text.validity\" [options]=\"validityOptions()\" [value]=\"validity()\" (valueChange)=\"validity.set($event)\" />\n </div>\n }\n <div class=\"sp-tokens__actions\">\n @if (badges().length) {\n <hm-button type=\"submit\" emphasis=\"high\" icon=\"key\" [disabled]=\"!canSubmit()\" [loading]=\"submitting()\">{{ text.create }}</hm-button>\n }\n <hm-button emphasis=\"minimal\" (clicked)=\"cancelCreate()\">{{ text.cancel }}</hm-button>\n </div>\n </form>\n } @else {\n <div class=\"sp-tokens__actions\">\n <hm-button emphasis=\"medium\" icon=\"plus\" [disabled]=\"atLimit()\" (clicked)=\"startCreate()\">{{ text.newToken }}</hm-button>\n <span class=\"sp-tokens__note\">{{ fmt(text.validCount, { valid: validCount(), max: maxActive() }) }}</span>\n </div>\n @if (atLimit()) {\n <p class=\"sp-tokens__note\">{{ text.limit }}</p>\n }\n }\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, isDevMode } from '@angular/core';\nimport { AUTH_CONFIG, AuthorizationService } from '@orfeu/angular/core';\nimport { AccountAvatarComponent, ButtonComponent, ComboboxComponent, ComboboxOption, HermesDensity, HermesSidebarService, HermesThemeMode, HermesThemeService, HermesToastService, IconComponent, SegmentedControlComponent, SegmentedOption, SettingsDialogComponent, SettingsRowComponent, SettingsSectionComponent, ShortcutListComponent, ThemePickerComponent, SelectComponent } from '@trismegisto/angular';\nimport { APP_PACKAGE_INFO, DensityService, SPINE_CONFIG, SpinePreferencesService, ThemePresetService, ThemeService, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { HERMES_FONTS, HermesFont, formatMessage } from '@trismegisto/primitives';\nimport { OnboardingService } from '../onboarding/onboarding.service';\nimport { AccountMfaComponent } from './account-mfa.component';\nimport { AccountRecoveryCodesComponent } from './account-recovery-codes.component';\nimport { SpineAccountSecurityService } from './account-security.service';\nimport { SpineAccountSecurityScopeDirective } from './account-security.state';\nimport { AccountSessionsComponent } from './account-sessions.component';\nimport { AppTokensComponent } from './app-tokens.component';\nimport { ShortcutService } from '../shortcuts/shortcut.service';\nimport { SpineLogoutService } from '../logout/logout.service';\nimport { SPINE_SETTINGS_KEYS, SPINE_SETTINGS_SECTIONS, SpineSettingsService } from './settings.service';\n\n/** Dependências que valem mostrar em \"Sobre\" (as demais são detalhe de build). */\n// check-strings: off — nomes de produto, não se traduzem.\nconst KEY_DEPENDENCIES: readonly { name: string; label: string }[] = [\n { name: '@angular/core', label: 'Angular' },\n { name: '@trismegisto/angular', label: 'Hermes DS' },\n { name: '@trismegisto/spine', label: 'Hermes Spine' },\n { name: '@orfeu/angular', label: 'Orfeu' },\n { name: 'apollo-angular', label: 'Apollo' },\n { name: 'graphql', label: 'GraphQL' },\n { name: 'rxjs', label: 'RxJS' },\n // check-strings: on\n];\n\n/**\n * Painel de configurações do shell (substitui as telas do antigo módulo \"Sistema\"): Aparência,\n * Região, Atalhos, Conta, Conta e segurança (MFA, códigos de recuperação e sessões do Argos) e Sobre, mais\n * as seções que o app registrar com `provideSettingsSection`. Tudo vale na hora — cada controle chama\n * o serviço que já persiste aquela preferência (tema, densidade, menu lateral, fuso).\n *\n * Aberto por `SpineSettingsService.open()` — menu do perfil, `Ctrl+,` ou `?settings=<seção>`.\n */\n@Component({\n selector: 'spine-settings-panel',\n imports: [\n NgComponentOutlet, AppTokensComponent,\n AccountMfaComponent, AccountRecoveryCodesComponent, AccountSessionsComponent, SpineAccountSecurityScopeDirective,\n AccountAvatarComponent, ButtonComponent, ComboboxComponent, IconComponent,\n SegmentedControlComponent, SettingsDialogComponent, SettingsRowComponent, SettingsSectionComponent,\n SelectComponent, ShortcutListComponent, ThemePickerComponent,\n ],\n templateUrl: './settings-panel.component.html',\n styleUrl: './settings-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SettingsPanelComponent {\n protected readonly settings = inject(SpineSettingsService);\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.settings;\n protected readonly fmt = formatMessage;\n protected readonly keys = SPINE_SETTINGS_KEYS;\n\n private readonly theme = inject(ThemeService);\n private readonly hermesTheme = inject(HermesThemeService);\n private readonly presets = inject(ThemePresetService);\n private readonly density = inject(DensityService);\n protected readonly sidebar = inject(HermesSidebarService);\n protected readonly preferences = inject(SpinePreferencesService);\n private readonly shortcutService = inject(ShortcutService);\n private readonly onboarding = inject(OnboardingService);\n private readonly auth = inject(AuthorizationService);\n private readonly authConfig = inject(AUTH_CONFIG, { optional: true });\n private readonly toast = inject(HermesToastService);\n protected readonly packageInfo = inject(APP_PACKAGE_INFO, { optional: true }) ?? {};\n private readonly config = inject(SPINE_CONFIG, { optional: true });\n protected readonly appSections = inject(SPINE_SETTINGS_SECTIONS, { optional: true }) ?? [];\n\n protected readonly appName = this.config?.appName ?? 'Hermes';\n\n /**\n * \"Copiar token de acesso\" é ferramenta de desenvolvimento: põe o token da sessão (Bearer de tudo que a\n * pessoa pode fazer) na área de transferência, ao alcance de qualquer app/extensão que leia o clipboard.\n * Só aparece com `SpineConfig.technicalDocs` (sem configuração, só em `isDevMode()`), como a visão técnica.\n */\n protected readonly showAccessToken = this.config?.technicalDocs ?? isDevMode();\n\n // ── Aparência ───────────────────────────────────────────────────────────────\n protected readonly themeOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'light', label: this.text.themeLight, icon: 'sun' },\n { value: 'dark', label: this.text.themeDark, icon: 'moon' },\n { value: 'system', label: this.text.themeSystem, icon: 'computer' },\n ]);\n protected readonly densityOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'comfortable', label: this.text.comfortable },\n { value: 'compact', label: this.text.compact },\n ]);\n // As fontes do config (as da lib, ou as do app via `provideUi({ theme: { fonts, replaceFonts } })`).\n protected readonly fontOptions: readonly SegmentedOption[] = (this.hermesTheme.fonts ?? HERMES_FONTS).map((f) => ({ value: f.id, label: f.label }));\n protected readonly sidebarOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'auto', label: this.text.sidebarAuto },\n { value: 'fixed', label: this.text.sidebarFixed },\n { value: 'compact', label: this.text.sidebarCompact },\n ]);\n\n protected readonly themeMode = computed(() => this.hermesTheme.mode());\n protected readonly appliedTheme = computed(() => this.hermesTheme.theme());\n protected readonly family = computed(() => this.hermesTheme.family());\n protected readonly densityValue = computed(() => this.hermesTheme.density());\n protected readonly fontValue = computed(() => this.hermesTheme.font());\n protected readonly families = this.presets.families;\n\n protected setThemeMode(mode: string): void {\n this.theme.setMode(mode as HermesThemeMode);\n }\n\n protected setFamily(id: string): void {\n const family = this.families.find((f) => f.id === id);\n if (family) this.presets.setPreset(family);\n }\n\n protected setDensity(value: string): void {\n this.density.setDensity(value as HermesDensity);\n }\n\n protected setFont(value: string): void {\n this.hermesTheme.setFont(value as HermesFont);\n }\n\n protected setSidebarMode(value: string): void {\n this.sidebar.setMode(value as 'auto' | 'fixed' | 'compact');\n }\n\n // ── Região ──────────────────────────────────────────────────────────────────\n protected readonly languageOptions = computed(() => {\n const appLanguage = this.preferences.languages.find((l) => l.value === this.preferences.appLanguage)?.label ?? this.preferences.appLanguage;\n return [\n { value: '', label: formatMessage(this.text.languageAuto, { language: appLanguage }) },\n ...this.preferences.languages,\n ];\n });\n\n /** ~400 fusos, cada um com o deslocamento calculado: só monta quando o painel abre pela\n * primeira vez, não no carregamento de toda página (o painel vive no layout desde o início). */\n private timeZoneCache: readonly ComboboxOption[] | null = null;\n protected readonly timeZoneOptions = computed<readonly ComboboxOption[]>(() => [\n { value: '', label: formatMessage(this.text.timeZoneAuto, { zone: this.preferences.browserTimeZone }) },\n ...(this.timeZoneCache ??= this.preferences\n .supportedTimeZones()\n .map((tz) => ({ value: tz, label: `${tz.replace(/_/g, ' ')} (${offsetOf(tz)})` }))),\n ]);\n\n /** Hora agora no fuso efetivo — prévia de como as datas vão aparecer. */\n protected readonly timeZonePreview = computed(() => {\n const zone = this.preferences.effectiveTimeZone();\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeStyle: 'short', timeZone: zone }).format(new Date())\n + ` (${offsetOf(zone)})`;\n } catch {\n return zone;\n }\n });\n\n // ── Atalhos ─────────────────────────────────────────────────────────────────\n /** Atalhos registrados (favoritos numa linha só) + os que outra peça dispara — os mesmos do painel \"?\". */\n protected readonly shortcutItems = this.shortcutService.panelItems;\n\n protected replayTour(): void {\n this.settings.close();\n this.onboarding.restart();\n }\n\n // ── Conta ───────────────────────────────────────────────────────────────────\n protected get profile() { return this.auth.profile; }\n protected get badge() { return this.auth.badge; }\n\n /** Validade da sessão lida do `exp` do próprio token (só leitura do payload, sem validar). */\n protected get sessionExpiry(): string {\n const exp = decodeTokenPayload(this.auth.getToken())?.['exp'];\n if (typeof exp !== 'number') return this.text.sessionUnknown;\n const at = new Date(exp * 1000);\n const minutes = Math.round((at.getTime() - Date.now()) / 60000);\n const when = new Intl.DateTimeFormat(this.messages.meta.locale, { timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() }).format(at);\n if (minutes <= 0) return formatMessage(this.text.sessionExpired, { time: when });\n return minutes < 60\n ? formatMessage(this.text.sessionExpiresIn, { minutes, time: when })\n : formatMessage(this.text.sessionExpiresAt, { time: when });\n }\n\n protected async copyToken(): Promise<void> {\n if (!this.showAccessToken) return;\n const token = this.auth.getToken();\n if (!token) { this.toast.warning(this.text.noSessionToken); return; }\n await this.copy(token, this.text.tokenCopied);\n }\n\n private readonly logoutService = inject(SpineLogoutService);\n /** \"Saindo…\" no botão; volta a `false` também quando a saída falha. */\n protected readonly logoutPending = this.logoutService.pending;\n\n /** O painel fica aberto até a saída dar certo: com falha, a pessoa continua aqui, com o aviso de erro. */\n protected async logout(): Promise<void> {\n if (await this.logoutService.logout()) this.settings.close();\n }\n\n // ── Conta e segurança ───────────────────────────────────────────────────────\n /** API da conta no Argos (Bearer com o token da sessão), a partir do `AUTH_CONFIG`. Sem ela (sem\n * `authority`/`realmId`, ou com `CHANGE_ME`) a seção não aparece. */\n protected readonly accountSecurity = inject(SpineAccountSecurityService).available;\n\n /** Login da pessoa (`preferred_username` do token, ou o e-mail), para dizer QUAL conta do Argos. */\n protected get accountLogin(): string {\n const payload = decodeTokenPayload(this.auth.getToken());\n const login = payload?.['preferred_username'] ?? payload?.['email'];\n return typeof login === 'string' ? login : '';\n }\n\n protected get accountRealm(): string {\n return this.authConfig?.realmId ?? '';\n }\n\n // ── Sobre ───────────────────────────────────────────────────────────────────\n protected readonly dependencies = KEY_DEPENDENCIES\n .map((d) => ({ ...d, version: this.packageInfo.dependencies?.[d.name] }))\n .filter((d) => !!d.version);\n\n protected get buildDate(): string {\n const date = this.packageInfo.buildDate;\n return date ? new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeStyle: 'short' }).format(new Date(date)) : '';\n }\n\n /** Texto pronto pra colar num chamado: app, versão, ambiente, navegador, tela, fuso e página. */\n protected async copySupportInfo(): Promise<void> {\n const info = this.packageInfo;\n const s = this.messages.support;\n const theme = formatMessage(s.themeValue, {\n theme: this.appliedTheme(), mode: this.themeMode(), family: this.family(), density: this.densityValue(), font: this.fontValue(),\n });\n const lines = [\n `${s.application}: ${this.appName}${info.name ? ` (${info.name})` : ''}`,\n `${s.version}: ${info.version ?? '—'}`,\n info.buildDate ? `${s.build}: ${this.buildDate}` : '',\n info.environment ? `${s.environment}: ${info.environment}` : '',\n `${s.page}: ${location.href}`,\n `${s.browser}: ${navigator.userAgent}`,\n `${s.screen}: ${window.innerWidth}×${window.innerHeight} @${window.devicePixelRatio}x`,\n `${s.theme}: ${theme}`,\n `${s.timeZone}: ${this.preferences.effectiveTimeZone()}`,\n `${s.accessLevel}: ${this.badge?.name ?? '—'}`,\n `${s.date}: ${new Date().toISOString()}`,\n ].filter(Boolean);\n await this.copy(lines.join('\\n'), this.text.supportCopied);\n }\n\n private async copy(text: string, success: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n this.toast.success(success);\n } catch {\n this.toast.error(this.text.copyBlocked);\n }\n }\n\n protected onOpenChange(open: boolean): void {\n if (!open) this.settings.close();\n }\n}\n\n/** \"UTC−03:00\" para um fuso IANA. */\nfunction offsetOf(timeZone: string): string {\n try {\n const part = new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'longOffset' })\n .formatToParts(new Date())\n .find((p) => p.type === 'timeZoneName')?.value;\n return (part ?? 'GMT').replace('GMT', 'UTC').replace('-', '−') || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nfunction decodeTokenPayload(token: string | null): Record<string, unknown> | null {\n const payload = token?.split('.')[1];\n if (!payload) return null;\n try {\n const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/').padEnd(Math.ceil(payload.length / 4) * 4, '='));\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n","<!-- Montado só enquanto aberto: nada disto (lista de fusos, leitura do token...) custa no\n carregamento de toda página. -->\n@if (settings.isOpen()) {\n <hm-settings-dialog\n [heading]=\"text.heading\"\n [open]=\"true\"\n (openChange)=\"onOpenChange($event)\"\n [activeSection]=\"settings.section()\"\n (activeSectionChange)=\"settings.section.set($event)\"\n >\n <!-- ── Conta ─────────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.account\" [label]=\"text.account\" icon=\"user\" [keywords]=\"text.accountKeywords\">\n <div class=\"sp-settings__profile\">\n <hm-account-avatar [name]=\"profile.name ?? text.user\" [imageUrl]=\"profile.picture\" />\n <span class=\"sp-settings__profile-text\">\n <strong>{{ profile.name ?? text.user }}</strong>\n @if (profile.role) { <span>{{ profile.role }}</span> }\n </span>\n </div>\n\n <!-- Só informativo: a troca de nível fica no menu do perfil, perto de onde se trabalha. -->\n @if (badge) {\n <hm-settings-row [label]=\"text.accessLevel\" [keywords]=\"text.accessLevelKeywords\">\n <span class=\"sp-settings__value\">{{ badge.name }}</span>\n </hm-settings-row>\n }\n\n <hm-settings-row [label]=\"text.session\" [description]=\"text.sessionDescription\" [keywords]=\"text.sessionKeywords\">\n <span class=\"sp-settings__value\">{{ sessionExpiry }}</span>\n </hm-settings-row>\n\n <!-- Só com SpineConfig.technicalDocs (padrão: isDevMode()): token da sessão no clipboard é ferramenta de dev. -->\n @if (showAccessToken) {\n <hm-settings-row [label]=\"text.accessToken\" [description]=\"text.accessTokenDescription\" [keywords]=\"text.accessTokenKeywords\">\n <hm-button emphasis=\"medium\" icon=\"copy\" (clicked)=\"copyToken()\">{{ text.copy }}</hm-button>\n </hm-settings-row>\n }\n\n <hm-settings-row [label]=\"text.appTokens\" [stacked]=\"true\"\n [description]=\"text.appTokensDescription\"\n [keywords]=\"text.appTokensKeywords\">\n <spine-app-tokens />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.logout\" [description]=\"text.logoutDescription\" [keywords]=\"text.logoutKeywords\">\n <hm-button emphasis=\"medium\" intent=\"danger\" icon=\"logout\" [loading]=\"logoutPending()\" (clicked)=\"logout()\">{{ text.logout }}</hm-button>\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Conta e segurança ─────────────────────────────────────────────── -->\n <!-- API da conta do Argos com o token da sessão (Bearer): MFA, códigos de recuperação e sessões aqui\n mesmo, sem abrir o Argos. O spineAccountSecurity dá às linhas o mesmo estado (reautenticação,\n cadastro em andamento), que morre quando o painel fecha. -->\n @if (accountSecurity) {\n <hm-settings-section spineAccountSecurity [key]=\"keys.security\" [label]=\"text.security\" icon=\"shield-check\" [description]=\"text.securityDescription\" [keywords]=\"text.securityKeywords\">\n @if (accountLogin || accountRealm) {\n <hm-settings-row [label]=\"text.signedInAccount\">\n @if (accountRealm) { <span rowDescription class=\"sp-settings__hint\">{{ fmt(text.signedInRealm, { realm: accountRealm }) }}</span> }\n <span class=\"sp-settings__value\">{{ profile.name ?? text.user }}@if (accountLogin) { <span class=\"sp-settings__muted\"> · {{ accountLogin }}</span> }</span>\n </hm-settings-row>\n }\n\n <hm-settings-row [label]=\"text.twoFactor\" [description]=\"text.twoFactorDescription\" [keywords]=\"text.twoFactorKeywords\" [stacked]=\"true\">\n <spine-account-mfa />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.recoveryCodes\" [description]=\"text.recoveryCodesDescription\" [keywords]=\"text.recoveryCodesKeywords\" [stacked]=\"true\">\n <spine-account-recovery-codes />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.sessions\" [description]=\"text.sessionsDescription\" [keywords]=\"text.sessionsKeywords\" [stacked]=\"true\">\n <spine-account-sessions />\n </hm-settings-row>\n </hm-settings-section>\n }\n\n <!-- ── Aparência ─────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.appearance\" [label]=\"text.appearance\" icon=\"color-palette\" [keywords]=\"text.appearanceKeywords\">\n <hm-settings-row [label]=\"text.theme\" [description]=\"text.themeDescription\" [keywords]=\"text.themeKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.theme\" [options]=\"themeOptions()\" [value]=\"themeMode()\" (valueChange)=\"setThemeMode($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.accent\" [description]=\"text.accentDescription\" [keywords]=\"text.accentKeywords\" [stacked]=\"true\">\n <hm-theme-picker\n [families]=\"families\"\n [family]=\"family()\"\n [theme]=\"appliedTheme()\"\n [showMode]=\"false\"\n (familyChosen)=\"setFamily($event)\"\n />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.density\" [description]=\"text.densityDescription\" [keywords]=\"text.densityKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.density\" [options]=\"densityOptions()\" [value]=\"densityValue()\" (valueChange)=\"setDensity($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.font\" [description]=\"text.fontDescription\" [keywords]=\"text.fontKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.font\" [options]=\"fontOptions\" [value]=\"fontValue()\" (valueChange)=\"setFont($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.sidebar\" [description]=\"text.sidebarDescription\" [keywords]=\"text.sidebarKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.sidebar\" [options]=\"sidebarOptions()\" [value]=\"sidebar.mode()\" (valueChange)=\"setSidebarMode($event)\" />\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Região ────────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.region\" [label]=\"text.region\" icon=\"clock\" [keywords]=\"text.regionKeywords\">\n <hm-settings-row [label]=\"text.language\" [description]=\"text.languageDescription\" [keywords]=\"text.languageKeywords\">\n <hm-select\n class=\"sp-settings__language\"\n [label]=\"text.language\"\n [labelHidden]=\"true\"\n [value]=\"preferences.language()\"\n (valueChange)=\"preferences.setLanguage($event ?? '')\"\n >\n @for (option of languageOptions(); track option.value) {\n <option [value]=\"option.value\" [attr.lang]=\"option.value || null\">{{ option.label }}</option>\n }\n </hm-select>\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.timeZone\" [keywords]=\"text.timeZoneKeywords\">\n <span rowDescription class=\"sp-settings__hint\">{{ fmt(text.timeZoneHint, { now: timeZonePreview() }) }}</span>\n <hm-combobox\n class=\"sp-settings__timezone\"\n [label]=\"text.timeZone\"\n [labelHidden]=\"true\"\n icon=\"world\"\n [options]=\"timeZoneOptions()\"\n [value]=\"preferences.timeZone()\"\n (valueChange)=\"preferences.setTimeZone($event)\"\n />\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Atalhos ───────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.shortcuts\" [label]=\"text.shortcuts\" icon=\"keyboard\" [description]=\"text.shortcutsDescription\" [keywords]=\"text.shortcutsKeywords\">\n <!-- Mesma lista do painel \"?\", sem busca (a do diálogo de configurações já cobre a seção);\n o interruptor de tecla única (WCAG 2.1.4) persiste no SpinePreferencesService. -->\n <hm-shortcut-list characterKeysToggle [registered]=\"false\" [items]=\"shortcutItems()\" [headingLevel]=\"4\" />\n <hm-settings-row [label]=\"text.tour\" [description]=\"text.tourDescription\" [keywords]=\"text.tourKeywords\">\n <hm-button emphasis=\"medium\" icon=\"play\" (clicked)=\"replayTour()\">{{ text.replayTour }}</hm-button>\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Seções do app (provideSettingsSection) ────────────────────────── -->\n @for (s of appSections; track s.key) {\n <hm-settings-section [key]=\"s.key\" [label]=\"s.label\" [icon]=\"s.icon ?? 'cog'\" [description]=\"s.description ?? ''\" [keywords]=\"s.keywords ?? ''\">\n <ng-container *ngComponentOutlet=\"s.component\" />\n </hm-settings-section>\n }\n\n <!-- ── Sobre ─────────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.about\" [label]=\"text.about\" icon=\"info-circle\" [keywords]=\"text.aboutKeywords\">\n <hm-settings-row [label]=\"text.application\">\n <span class=\"sp-settings__value\">{{ appName }}@if (packageInfo.name) { <span class=\"sp-settings__muted\"> · {{ packageInfo.name }}</span> }</span>\n </hm-settings-row>\n <hm-settings-row [label]=\"text.version\" [keywords]=\"text.versionKeywords\">\n <span class=\"sp-settings__value sp-settings__mono\">{{ packageInfo.version ?? '—' }}</span>\n </hm-settings-row>\n @if (buildDate) {\n <hm-settings-row [label]=\"text.buildDate\">\n <span class=\"sp-settings__value\">{{ buildDate }}</span>\n </hm-settings-row>\n }\n @if (packageInfo.environment) {\n <hm-settings-row [label]=\"text.environment\" [keywords]=\"text.environmentKeywords\">\n <span class=\"sp-settings__value\">{{ packageInfo.environment }}</span>\n </hm-settings-row>\n }\n @if (packageInfo.repository?.url || packageInfo.docs || packageInfo.issues) {\n <hm-settings-row [label]=\"text.links\" [keywords]=\"text.linksKeywords\">\n <span class=\"sp-settings__links\">\n @if (packageInfo.docs) { <hm-button emphasis=\"minimal\" icon=\"book\" [link]=\"packageInfo.docs\" [newTab]=\"true\">{{ text.docs }}</hm-button> }\n @if (packageInfo.issues) { <hm-button emphasis=\"minimal\" icon=\"bug\" [link]=\"packageInfo.issues\" [newTab]=\"true\">{{ text.reportIssue }}</hm-button> }\n @if (packageInfo.repository?.url) { <hm-button emphasis=\"minimal\" icon=\"link\" [link]=\"packageInfo.repository!.url!\" [newTab]=\"true\">{{ text.repository }}</hm-button> }\n </span>\n </hm-settings-row>\n }\n @if (dependencies.length) {\n <hm-settings-row [label]=\"text.dependencies\" [description]=\"text.dependenciesDescription\" [keywords]=\"text.dependenciesKeywords\" [stacked]=\"true\">\n <dl class=\"sp-settings__deps\">\n @for (d of dependencies; track d.name) {\n <div><dt>{{ d.label }}</dt><dd class=\"sp-settings__mono\">{{ d.version }}</dd></div>\n }\n </dl>\n </hm-settings-row>\n }\n <hm-settings-row [label]=\"text.supportInfo\" [description]=\"text.supportInfoDescription\" [keywords]=\"text.supportInfoKeywords\">\n <hm-button emphasis=\"medium\" icon=\"clipboard\" (clicked)=\"copySupportInfo()\">{{ text.copy }}</hm-button>\n </hm-settings-row>\n </hm-settings-section>\n </hm-settings-dialog>\n}\n","import { DestroyRef, Injectable, computed, inject, isDevMode, signal } from '@angular/core';\nimport { ViewService } from '@orfeu/angular/core';\nimport { Route, SPINE_CONFIG, SPINE_MESSAGES, routerIdOf, spineRoutesOf } from '@trismegisto/spine';\nimport { ComponentDistributorService, RouteDocument, componentRouterId } from '@trismegisto/spine/routing';\n\n/** Documento de uma tela que a pessoa logada pode abrir. */\nexport interface DocsEntry extends RouteDocument {\n /** Chave da tela (router_id ou, sem ele, o do template), sempre em minúsculas. */\n readonly id: string;\n readonly title: string;\n readonly group: string;\n}\n\nexport interface DocsGroup {\n readonly title: string;\n readonly entries: readonly DocsEntry[];\n}\n\nexport type DocsView = 'usage' | 'technical';\n\ninterface ScreenInfo {\n readonly label: string;\n readonly module: string;\n}\n\n/**\n * Estado da documentação das telas: o que está registrado em `COMPONENT_ROUTES` com `document`,\n * filtrado pelas telas que existem na árvore da pessoa (documento de tela sem acesso nunca é oferecido),\n * e a leitura em andamento no modal `spine-docs`.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineDocsService {\n readonly #distributor = inject(ComponentDistributorService);\n readonly #views = inject(ViewService);\n readonly #messages = inject(SPINE_MESSAGES);\n\n /** Visão técnica liberada (`SpineConfig.technicalDocs`; sem configuração, só em desenvolvimento). */\n readonly technicalAvailable: boolean = inject(SPINE_CONFIG, { optional: true })?.technicalDocs ?? isDevMode();\n\n readonly #isOpen = signal(false);\n readonly #current = signal<DocsEntry | null>(null);\n readonly #view = signal<DocsView>('usage');\n readonly #content = signal('');\n readonly #loading = signal(false);\n readonly #failed = signal(false);\n /** Identifica a leitura vigente; respostas de leituras anteriores são ignoradas. */\n #ticket = 0;\n /** A view do Orfeu não é um signal: este contador força a releitura da árvore. */\n readonly #treeRevision = signal(0);\n\n readonly isOpen = this.#isOpen.asReadonly();\n readonly current = this.#current.asReadonly();\n readonly view = this.#view.asReadonly();\n readonly content = this.#content.asReadonly();\n readonly loading = this.#loading.asReadonly();\n readonly error = computed(() => (this.#failed() ? this.#messages.docs.loadError : ''));\n readonly showTechnical = computed(\n () => this.technicalAvailable && !!this.#current()?.loadTechnical,\n );\n\n readonly #offered = computed<ReadonlyMap<string, DocsEntry>>(() => {\n this.#treeRevision();\n const screens = this.#screens();\n const offered = new Map<string, DocsEntry>();\n for (const registered of this.#distributor.entries) {\n const document = registered.document;\n if (!document) continue;\n const key = (componentRouterId(registered) ?? registered.source_template_router_id)?.toLowerCase();\n if (!key || offered.has(key)) continue;\n const screen = screens.get(key);\n if (!screen) continue;\n offered.set(key, {\n ...document,\n id: key,\n title: document.title ?? screen.label,\n group: document.group ?? screen.module,\n });\n }\n return offered;\n });\n\n readonly index = computed<DocsGroup[]>(() => {\n const locale = this.#messages.meta.locale;\n const compare = (a: string, b: string) => a.localeCompare(b, locale);\n const byGroup = new Map<string, DocsEntry[]>();\n for (const entry of this.#offered().values()) {\n const list = byGroup.get(entry.group);\n if (list) list.push(entry);\n else byGroup.set(entry.group, [entry]);\n }\n return [...byGroup]\n .map(([title, entries]) => ({ title, entries: entries.sort((a, b) => compare(a.title, b.title)) }))\n .sort((a, b) => compare(a.title, b.title));\n });\n\n constructor() {\n // Quando a view muda (login, troca de crachá), o botão da barra da página acompanha sem esperar\n // a próxima abertura.\n const changes = (this.#views as Partial<Pick<ViewService, 'currentView$'>>).currentView$;\n // A emissão síncrona da inscrição é a view que o `#offered` já lê; só as seguintes importam.\n let subscribed = false;\n const subscription = changes?.subscribe?.(() => {\n if (subscribed) this.#refreshTree();\n });\n subscribed = true;\n if (subscription) inject(DestroyRef).onDestroy(() => subscription.unsubscribe());\n }\n\n documentFor(routerId: string | null | undefined, sourceTemplateRouterId?: string | null): DocsEntry | null {\n const offered = this.#offered();\n for (const candidate of [routerId, sourceTemplateRouterId]) {\n if (!candidate) continue;\n const entry = offered.get(candidate.toLowerCase());\n if (entry) return entry;\n }\n return null;\n }\n\n openForRoute(routerId: string | null | undefined, sourceTemplateRouterId?: string | null): void {\n this.#refreshTree();\n this.#isOpen.set(true);\n const entry = this.documentFor(routerId, sourceTemplateRouterId);\n if (entry) void this.open(entry);\n }\n\n openIndex(): void {\n this.#refreshTree();\n this.#isOpen.set(true);\n }\n\n close(): void {\n this.#isOpen.set(false);\n }\n\n open(entry: DocsEntry, view: DocsView = 'usage'): Promise<void> {\n this.#current.set(entry);\n return this.show(view);\n }\n\n async show(view: DocsView): Promise<void> {\n const entry = this.#current();\n if (!entry) return;\n const technical = view === 'technical' && this.technicalAvailable ? entry.loadTechnical : undefined;\n const ticket = ++this.#ticket;\n\n this.#view.set(technical ? 'technical' : 'usage');\n this.#loading.set(true);\n this.#failed.set(false);\n\n let text = '';\n let failed = false;\n try {\n text = await (technical ?? entry.load)();\n } catch {\n failed = true;\n }\n if (ticket !== this.#ticket) return;\n\n this.#content.set(failed ? '' : text);\n this.#failed.set(failed);\n this.#loading.set(false);\n }\n\n #refreshTree(): void {\n this.#treeRevision.update((n) => n + 1);\n }\n\n /** Telas da árvore da pessoa, por router_id e por template, com rótulo e módulo de topo. */\n #screens(): Map<string, ScreenInfo> {\n const screens = new Map<string, ScreenInfo>();\n const visit = (node: Route, module: string) => {\n const info: ScreenInfo = { label: node.route_display_name ?? '', module };\n for (const key of [routerIdOf(node), node.source_template_router_id]) {\n if (key && !screens.has(key.toLowerCase())) screens.set(key.toLowerCase(), info);\n }\n for (const child of node.routes ?? []) visit(child, module);\n };\n for (const root of spineRoutesOf(this.#views.currentView)) visit(root, root.route_display_name ?? '');\n return screens;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal } from '@angular/core';\nimport { BreadcrumbComponent, BreadcrumbItem, IconButtonComponent, IconComponent, TooltipDirective } from '@trismegisto/angular';\nimport { QuickAccessItem, Route, routerIdOf, SpineQuickAccessService, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineDocsService } from '../docs/docs.service';\n\n/**\n * Barra de contexto do topo de CADA painel do workspace: título e ícone da página e as\n * ações que valem pra página inteira (favoritar, copiar link, documentação) em cima; a descrição da\n * tela logo abaixo do título; a trilha (breadcrumb) embaixo.\n *\n * A descrição é do ROUTER (`web.router.description`, editada no Argos), não da tela: é aqui que todo\n * app mostra \"o que esta página faz\", então as telas NÃO repetem título+descrição internos.\n * Tela identificada pelo `router_id` do nó 'page' (`routerIdOf`), nunca pelo `web.routes.route_id`.\n *\n * Mora dentro do painel (não num shell global) porque cada painel do `hm-workspace` resolve a\n * própria aba: dois painéis lado a lado mostram duas trilhas diferentes ao mesmo tempo. Por isso\n * recebe a `chain` (header→…→page) do painel em vez de ler a \"página atual\" de algum serviço global.\n *\n * Só o painel focado alimenta os \"recentes\" (`recordRecent`) — os outros apenas exibem.\n *\n * Favoritos e recentes moram no `SpineQuickAccessService` (compartilhado com a tela inicial): o\n * coração daqui e a seção \"Favoritos\" do Início mudam juntos.\n */\n@Component({\n selector: 'spine-page-bar',\n imports: [BreadcrumbComponent, IconComponent, IconButtonComponent, TooltipDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (title(); as pageTitle) {\n <header class=\"spine-page-bar\" data-tour=\"breadcrumb\">\n <div class=\"spine-page-bar__identity\">\n <div class=\"spine-page-bar__title-row\">\n @if (icon(); as ic) {\n <hm-icon class=\"spine-page-bar__icon\" [shape]=\"ic\" />\n }\n <h1 class=\"spine-page-bar__title\">{{ pageTitle }}</h1>\n\n <span class=\"spine-page-bar__actions\">\n <!-- O estado vai no nome (\"Favoritar\" / \"Remover dos favoritos\"). Sem aria-pressed: no host\n <hm-icon-button> ele caía num elemento sem papel, e não no <button> (o leitor não lia).\n A dica (hmTooltip) repete o nome para quem enxerga: só ícone, sem texto, o botão não diz\n o que faz até ser clicado. -->\n <hm-icon-button\n emphasis=\"subtle\"\n icon=\"heart\" [solid]=\"isFavorite()\"\n [label]=\"isFavorite() ? text.unfavorite : text.favorite\"\n [hmTooltip]=\"isFavorite() ? text.unfavorite : text.favorite\"\n [class.spine-page-bar__fav--on]=\"isFavorite()\"\n (clicked)=\"toggleFavorite()\"\n />\n <hm-icon-button\n emphasis=\"subtle\"\n [icon]=\"linkCopied() ? 'check' : 'copy'\"\n [label]=\"linkCopied() ? text.linkCopied : text.copyLink\"\n [hmTooltip]=\"linkCopied() ? text.linkCopied : text.copyLink\"\n (clicked)=\"copyLink()\"\n />\n <!-- Só quando a tela tem documento registrado (\\`document\\` no mapa de componentes). -->\n @if (hasDoc()) {\n <hm-icon-button emphasis=\"subtle\" icon=\"doc-list\" [label]=\"text.docs\" [hmTooltip]=\"text.docs\" (clicked)=\"openDocs()\" />\n }\n </span>\n </div>\n\n @if (description(); as desc) {\n <p class=\"spine-page-bar__description\">{{ desc }}</p>\n }\n\n <!-- Trilha: o hm-breadcrumb da lib (nav nomeado, lista ordenada, aria-current no último degrau,\n recolhe o meio de trilha longa). Só com mais de um nível — numa página de nível 1 a trilha\n repetiria o título. -->\n @if (crumbs().length > 1) {\n <hm-breadcrumb class=\"spine-page-bar__trail\" [items]=\"trail()\" [label]=\"text.trail\" />\n }\n </div>\n\n <!-- Conteúdo projetado pela tela (botões dela). -->\n <div class=\"spine-page-bar__extra\"><ng-content /></div>\n </header>\n }\n `,\n styles: [`\n :host { display: block; }\n .spine-page-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--hm-space-sm);\n padding: var(--hm-space-sm) var(--hm-space-md);\n margin: 0;\n /* Faixa própria: fundo elevado e uma linha embaixo separam a barra do conteúdo da página. */\n background: var(--hm-surface-raised);\n border-block-end: var(--hm-border-hairline, 1px) solid var(--hm-divider);\n }\n /* Cresce para a trilha ter a largura da barra (e recolher/truncar nela), sem empurrar as ações extras.\n Entre o nome da página e a trilha: --hm-space-md até o TEXTO da trilha (com menos as linhas liam como um bloco\n só) — o respiro interno de cada degrau do hm-breadcrumb (--hm-space-micro) já conta nessa distância. */\n .spine-page-bar__identity {\n display: flex;\n flex: 1 1 auto;\n min-inline-size: 0;\n flex-direction: column;\n gap: calc(var(--hm-space-md) - var(--hm-space-micro));\n }\n .spine-page-bar__title-row { display: flex; align-items: center; gap: var(--hm-space-xs); min-inline-size: 0; }\n .spine-page-bar__icon { flex: none; color: var(--hm-accent); font-size: var(--hm-font-size-xxl, 28px); }\n .spine-page-bar__title {\n min-inline-size: 0;\n margin: 0;\n overflow: hidden;\n color: var(--hm-text);\n font-size: var(--hm-font-size-xl, 22px);\n font-weight: var(--hm-font-weight-bold, 700);\n line-height: var(--hm-line-height-tight, 1.2);\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n /* Colada no título (desconta o gap da coluna, que é o respiro título→trilha): fica --hm-space-nano\n abaixo dele. Texto secundário, quebra em mais linhas sem truncar. */\n .spine-page-bar__description {\n max-inline-size: 80ch;\n margin: calc(var(--hm-space-nano) - (var(--hm-space-md) - var(--hm-space-micro))) 0 0;\n color: var(--hm-muted);\n font-size: var(--hm-font-size-sm, 14px);\n line-height: var(--hm-line-height-normal, 1.5);\n }\n .spine-page-bar__actions { display: inline-flex; flex: none; align-items: center; gap: var(--hm-space-micro); margin-inline-start: var(--hm-space-nano); }\n /* Favorito ativo: ícone preenchido em --hm-danger (o mesmo tratamento da tela inicial). */\n .spine-page-bar__fav--on { color: var(--hm-danger); }\n /* Trilha = hm-breadcrumb (visual do @trismegisto/core: degrau clicável na cor de ação, o atual em texto\n secundário, separador em ângulo). Cada degrau tem um respiro interno (alvo de foco/hover); a margem\n negativa do mesmo tamanho alinha o texto do primeiro degrau com o título, em qualquer densidade. */\n .spine-page-bar__trail { margin-inline-start: calc(-1 * var(--hm-space-micro)); margin-block-end: calc(-1 * var(--hm-space-micro)); }\n .spine-page-bar__extra { display: flex; flex: none; align-items: center; gap: var(--hm-space-xxxs); }\n .spine-page-bar__extra:empty { display: none; }\n `],\n})\nexport class SpinePageBarComponent {\n protected readonly text = inject(SPINE_MESSAGES).pageBar;\n /** Cadeia resolvida (header→…→page) do painel; `null` enquanto a URL não resolve. */\n readonly chain = input<Route[] | null>(null);\n /** Só o painel focado registra a página em \"recentes\". */\n readonly recordRecent = input(false);\n\n protected readonly linkCopied = signal(false);\n private readonly docs = inject(SpineDocsService);\n\n /** A página (último nó da cadeia). */\n private readonly page = computed(() => this.chain()?.at(-1) ?? null);\n /** router_id da página -- chave do documento dela (o router do template entra como alternativa). */\n private readonly routerId = computed(() => routerIdOf(this.page()));\n private readonly sourceTemplateRouterId = computed(() => this.page()?.source_template_router_id ?? null);\n protected readonly hasDoc = computed(() => !!this.docs.documentFor(this.routerId(), this.sourceTemplateRouterId()));\n\n /** Descrição do router da página (`web.router.description`); vazia = sem a linha. */\n protected readonly description = computed(() => this.page()?.description?.trim() || '');\n\n protected openDocs(): void {\n this.docs.openForRoute(this.routerId(), this.sourceTemplateRouterId());\n }\n\n private readonly quickAccess = inject(SpineQuickAccessService);\n\n constructor() {\n effect(() => {\n const item = this.currentItem();\n if (this.recordRecent() && item) this.quickAccess.recordVisit(item);\n });\n }\n\n protected readonly crumbs = computed<{ label: string; link: string }[]>(() =>\n (this.chain() ?? [])\n .filter((r): r is Route & { route_display_name: string } => !!r.route_display_name)\n .map((r) => ({ label: r.route_display_name, link: r.route_redirect ?? '' })),\n );\n\n /** Degraus do `hm-breadcrumb`: nível sem endereço (grupo) vira texto, sem link. */\n protected readonly trail = computed<BreadcrumbItem[]>(() =>\n this.crumbs().map(({ label, link }) => (link ? { label, routerLink: link } : { label })),\n );\n\n protected readonly title = computed<string>(() => this.crumbs().at(-1)?.label ?? '');\n\n /** Ícone da própria página; cai no do módulo quando a página não tem. */\n protected readonly icon = computed<string | null>(() => {\n const chain = this.chain() ?? [];\n return chain.at(-1)?.route_icon || chain[0]?.route_icon || null;\n });\n\n /** A página do painel como item de favorito/recente, com a trilha (\"onde fica\") dela. */\n private readonly currentItem = computed<QuickAccessItem | null>(() => {\n const crumbs = this.crumbs();\n const last = crumbs.at(-1);\n if (!last?.link) return null;\n return {\n id: last.link,\n icon: this.icon() || 'application',\n displayName: last.label,\n redirect: last.link,\n trail: crumbs.slice(0, -1).map((c) => c.label),\n };\n });\n\n protected readonly isFavorite = computed(() => this.quickAccess.isFavorite(this.currentItem()?.id));\n\n protected toggleFavorite(): void {\n const item = this.currentItem();\n if (item) this.quickAccess.toggleFavorite(item);\n }\n\n protected copyLink(): void {\n try {\n void navigator.clipboard?.writeText(window.location.href);\n this.linkCopied.set(true);\n setTimeout(() => this.linkCopied.set(false), 2000);\n } catch {\n /* clipboard indisponível */\n }\n }\n\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Type, effect, inject, input, signal } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { ViewService } from '@orfeu/angular/core';\nimport { IconComponent, LoadingSquareComponent } from '@trismegisto/angular';\nimport { Route, routerIdOf, SPINE_MESSAGES, spineRoutesOf } from '@trismegisto/spine';\nimport { ComponentDistributorService, LoggerService, resolveEffectiveRouteChain } from '@trismegisto/spine/routing';\nimport { SpinePageBarComponent } from './spine-page-bar.component';\n\n// Componente já carregado para cada url, comum a todos os painéis: reabrir a mesma tela em outro\n// painel (ou voltar a ela) não passa de novo pelo distribuidor.\nconst componentCache = new Map<string, Type<unknown>>();\n\n/**\n * Conteúdo de um painel do `hm-workspace`. Como vários painéis ficam visíveis ao mesmo tempo, cada\n * um monta a sua tela a partir da própria `url`, sem `<router-outlet>`: o roteador só conhece uma\n * rota ativa, e aqui cada painel precisa manter a sua.\n *\n * Mostra o quadrado de carregamento enquanto o componente chega, a tela quando ele chega, ou o\n * aviso de \"não encontrado\" quando a url não leva a nenhuma rota com tela.\n */\n@Component({\n selector: 'spine-page-panel',\n imports: [NgComponentOutlet, LoadingSquareComponent, IconComponent, SpinePageBarComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <spine-page-bar [chain]=\"chain()\" [recordRecent]=\"isFocusedPanel()\" />\n <div class=\"spine-page-panel__content\">\n @if (loading()) {\n <div class=\"spine-page-panel__loading\"><hm-loading-square /></div>\n } @else if (component(); as cmp) {\n <ng-container [ngComponentOutlet]=\"cmp\" />\n } @else {\n <div class=\"spine-page-panel__empty\">\n <hm-icon shape=\"search-magnify\" size=\"xl\" />\n <p class=\"spine-page-panel__empty-title\">{{ text.notFoundTitle }}</p>\n <p class=\"spine-page-panel__empty-description\">{{ text.notFoundText }}</p>\n </div>\n }\n </div>\n `,\n styles: [`\n :host { display: flex; flex-direction: column; block-size: 100%; min-block-size: 0; }\n .spine-page-panel__content { flex: 1; min-block-size: 0; display: flex; flex-direction: column; padding: var(--hm-space-lg, 1.5rem) var(--hm-space-md, 1rem); }\n .spine-page-panel__loading { display: flex; flex: 1; align-items: center; justify-content: center; min-block-size: 50vh; padding: var(--hm-space-xl); }\n .spine-page-panel__empty {\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--hm-space-sm);\n padding: var(--hm-space-xl);\n text-align: center;\n color: var(--hm-muted);\n }\n .spine-page-panel__empty hm-icon { color: var(--hm-muted); }\n .spine-page-panel__empty-title { margin: 0; color: var(--hm-text); font-size: var(--hm-font-size-lg, 18px); font-weight: 600; }\n .spine-page-panel__empty-description { margin: 0; max-inline-size: 32ch; font-size: var(--hm-font-size-sm, 14px); }\n `],\n})\nexport class SpinePagePanelComponent {\n protected readonly text = inject(SPINE_MESSAGES).pagePanel;\n readonly url = input.required<string>();\n /** Só o painel focado fala pela página inteira: visita recente, título da aba e rota no logger. */\n readonly isFocusedPanel = input(true);\n\n private readonly viewService = inject(ViewService);\n private readonly distributor = inject(ComponentDistributorService);\n private readonly logger = inject(LoggerService);\n private readonly title = inject(Title);\n\n protected readonly loading = signal(true);\n protected readonly component = signal<Type<unknown> | null>(null);\n protected readonly chain = signal<Route[] | null>(null);\n\n constructor() {\n effect(() => {\n const url = this.url();\n void this.resolve(url);\n });\n // Com as abas mantidas vivas, o painel que recebe o foco de volta já tem a tela pronta; basta\n // reaplicar o que só o focado faz, sem carregar nada de novo.\n effect(() => {\n if (this.isFocusedPanel() && this.chain()) this.afterResolved();\n });\n }\n\n /** Cadeia de rotas da url (sem os nós que só agrupam) e o componente da última delas. */\n private async resolve(url: string): Promise<void> {\n const chain = resolveEffectiveRouteChain(\n spineRoutesOf(this.viewService.currentView),\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n this.chain.set(chain);\n\n const leaf = chain?.at(-1) ?? null;\n if (!leaf) {\n this.component.set(null);\n this.loading.set(false);\n return;\n }\n\n const cached = componentCache.get(url);\n if (cached) {\n this.component.set(cached);\n this.loading.set(false);\n this.afterResolved();\n return;\n }\n\n this.loading.set(true);\n this.component.set(null);\n\n const component = await this.distributor.getComponent(routerIdOf(leaf) ?? '', leaf.source_template_router_id);\n\n // A url mudou enquanto o carregamento corria: este resultado já não interessa.\n if (url !== this.url()) return;\n\n componentCache.set(url, component);\n this.component.set(component);\n this.loading.set(false);\n this.afterResolved();\n }\n\n /** O que acontece quando a tela do painel focado fica pronta. */\n private afterResolved(): void {\n if (!this.isFocusedPanel()) return;\n const chain = this.chain();\n if (chain) this.logger.setLogger(chain);\n const leafName = chain?.at(-1)?.route_display_name;\n if (leafName) this.title.setTitle(leafName);\n }\n}\n","import { Directive, DestroyRef, ElementRef, inject, input, output } from '@angular/core';\n\n/**\n * Em painéis NÃO focados do `hm-workspace`, um `<a href>`/`[routerLink]` clicado navegaria o\n * `Router` de verdade — que só existe UM na aplicação, e está sempre atrelado ao painel FOCADO\n * (ver `SpineWorkspaceNavService`). Sem isto, clicar num link dentro de um painel secundário (um\n * item da sidebar, uma aba de submenu, um link de breadcrumb, qualquer `routerLink` dentro de uma\n * tela de feature) navegaria a tela ERRADA — o painel focado, não o painel onde o clique\n * aconteceu. Porte 1:1 do mesmo diretório do docs/website\n * (`docs/website/src/app/workspace/panel-local-link.directive.ts`) — genérico, sem nada\n * específico do site de documentação.\n *\n * Intercepta em fase de CAPTURA pra resolver a navegação LOCALMENTE antes do `RouterLink`\n * conseguir agir. Abrir em nova aba (Ctrl/⌘ + clique, clique do meio) continua funcionando\n * normalmente — só intercepta o clique comum.\n */\n@Directive({ selector: '[appPanelLocalLink]' })\nexport class PanelLocalLinkDirective {\n /** `true` = intercepta (painel não-focado); `false` = deixa o `RouterLink` normal agir. */\n readonly appPanelLocalLink = input(false);\n readonly localNavigate = output<string>();\n\n constructor() {\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const destroyRef = inject(DestroyRef);\n\n const onClick = (event: MouseEvent): void => {\n if (!this.appPanelLocalLink()) return;\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n\n const anchor = (event.target as HTMLElement).closest('a[href]');\n if (!anchor || !host.contains(anchor)) return;\n const href = anchor.getAttribute('href');\n if (!href || !href.startsWith('/')) return; // só rotas internas do próprio app\n\n event.preventDefault();\n event.stopPropagation();\n this.localNavigate.emit(href);\n };\n\n host.addEventListener('click', onClick, true);\n destroyRef.onDestroy(() => host.removeEventListener('click', onClick, true));\n }\n}\n","import DOMPurify, { type Config, type DOMPurify as Purifier } from 'dompurify';\n\n/**\n * Perfil do DOMPurify para o Markdown do spine (documentação de tela, novidades). Mais restrito que o\n * padrão: o HTML entra no DOM do shell (sem shadow DOM), então\n * - `<style>` e o atributo `style` ficam de fora (CSS valeria para a página inteira: esconder/redesenhar a\n * UI, sobrepor um aviso falso com `position: fixed`, exfiltrar por seletor de atributo);\n * - formulário e controles (`<form>`, `<input>`, `<button>`, `<textarea>`, `<select>`) e `<iframe>` ficam de\n * fora (tela de login falsa dentro do conteúdo);\n * - link para outra origem abre em outra aba com `rel=\"noopener noreferrer\"`.\n */\nexport const SPINE_MARKDOWN_PURIFY_CONFIG: Config = {\n FORBID_TAGS: ['style', 'form', 'input', 'button', 'textarea', 'select', 'option', 'iframe', 'frame', 'frameset', 'object', 'embed', 'link', 'meta', 'base'],\n FORBID_ATTR: ['style', 'target', 'formaction', 'action'],\n ALLOW_DATA_ATTR: false,\n};\n\nlet instance: Purifier | null | undefined;\n\n/** Instância própria (o hook de links não vaza para o DOMPurify global que o app use). `null` sem DOM. */\nfunction purifier(): Purifier | null {\n if (instance !== undefined) return instance;\n if (typeof window === 'undefined') return (instance = null);\n const purify = DOMPurify(window);\n if (!purify.isSupported) return (instance = null);\n purify.addHook('afterSanitizeAttributes', (node) => {\n if (node.nodeName !== 'A') return;\n const href = node.getAttribute('href');\n if (!href) return;\n let external = false;\n try {\n external = new URL(href, window.location.href).origin !== window.location.origin;\n } catch {\n external = false;\n }\n if (external) {\n node.setAttribute('target', '_blank');\n node.setAttribute('rel', 'noopener noreferrer');\n }\n });\n return (instance = purify);\n}\n\n/** HTML limpo pelo perfil do spine, ou `null` quando não há DOM (SSR: melhor não renderizar). */\nexport function sanitizeSpineMarkdownHtml(html: string): string | null {\n const purify = purifier();\n return purify ? (purify.sanitize(html, SPINE_MARKDOWN_PURIFY_CONFIG) as string) : null;\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Marked } from 'marked';\nimport { sanitizeSpineMarkdownHtml } from './markdown-sanitize';\n\n// Instância própria: não mexe nas opções globais do `marked` que o app possa usar.\nconst parser = new Marked({ gfm: true, breaks: false, async: false });\n\n/**\n * Renderiza Markdown (GFM) como HTML com a tipografia do design system. O texto é tratado como dado:\n * o HTML gerado passa pelo DOMPurify, com o perfil restrito do spine (`SPINE_MARKDOWN_PURIFY_CONFIG`: sem\n * `<style>`/`style`, formulários e `<iframe>`; link externo com `rel=\"noopener noreferrer\"`), antes de chegar ao DOM.\n */\n@Component({\n selector: 'spine-markdown',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // O HTML injetado não recebe os atributos do encapsulamento; os estilos ficam presos a `.spine-md`.\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (html(); as markup) {\n <div class=\"spine-md\" [innerHTML]=\"markup\"></div>\n }\n `,\n styles: `\n .spine-md {\n color: var(--hm-text);\n font-size: var(--hm-font-size-sm);\n line-height: var(--hm-line-height-normal);\n overflow-wrap: anywhere;\n }\n .spine-md > :first-child { margin-block-start: 0; }\n .spine-md > :last-child { margin-block-end: 0; }\n .spine-md :is(h1, h2, h3, h4, h5, h6) {\n margin-block: var(--hm-space-lg) var(--hm-space-sm);\n color: var(--hm-text);\n font-weight: var(--hm-font-weight-semibold);\n line-height: var(--hm-line-height-snug);\n }\n .spine-md h1 { font-size: var(--hm-font-size-xxl); }\n .spine-md h2 { font-size: var(--hm-font-size-xl); }\n .spine-md h3 { font-size: var(--hm-font-size-lg); }\n .spine-md :is(h4, h5, h6) { font-size: var(--hm-font-size-md); }\n .spine-md :is(p, ul, ol, blockquote, pre, table) { margin-block: 0 var(--hm-space-md); }\n .spine-md :is(ul, ol) { padding-inline-start: var(--hm-space-lg); }\n .spine-md li + li { margin-block-start: var(--hm-space-micro); }\n .spine-md blockquote {\n margin-inline: 0;\n padding-inline-start: var(--hm-space-md);\n border-inline-start: var(--hm-border-thin) solid var(--hm-divider);\n color: var(--hm-muted);\n }\n .spine-md code {\n padding-inline: var(--hm-space-micro);\n border-radius: var(--hm-radius-micro);\n background: var(--hm-surface-raised);\n font-family: var(--hm-font-mono);\n font-size: var(--hm-font-size-xs);\n }\n .spine-md pre {\n padding: var(--hm-space-sm) var(--hm-space-md);\n border-radius: var(--hm-radius);\n background: var(--hm-surface-raised);\n white-space: pre-wrap;\n }\n .spine-md pre code { padding: 0; background: none; }\n .spine-md table {\n display: block;\n max-inline-size: 100%;\n overflow-x: auto;\n border-collapse: collapse;\n overflow-wrap: normal;\n }\n .spine-md :is(th, td) {\n padding: var(--hm-space-xs) var(--hm-space-sm);\n border: var(--hm-border-hairline) solid var(--hm-divider);\n text-align: start;\n vertical-align: top;\n }\n .spine-md th { background: var(--hm-surface-raised); font-weight: var(--hm-font-weight-semibold); }\n .spine-md hr {\n margin-block: var(--hm-space-lg);\n border: 0;\n border-block-start: var(--hm-border-hairline) solid var(--hm-divider);\n }\n .spine-md a {\n color: var(--hm-accent);\n text-decoration: underline;\n text-underline-offset: 0.2em;\n }\n .spine-md a:focus-visible {\n outline: var(--hm-border-thin) solid var(--hm-accent);\n outline-offset: var(--hm-border-hairline);\n border-radius: var(--hm-radius-micro);\n }\n .spine-md img { max-inline-size: 100%; block-size: auto; }\n `,\n})\nexport class SpineMarkdownComponent {\n /** Markdown cru. Vazio não desenha nada. */\n readonly content = input('');\n\n readonly #sanitizer = inject(DomSanitizer);\n\n protected readonly html = computed<SafeHtml | null>(() => {\n const source = this.content();\n // Sem DOM (SSR) o DOMPurify não limpa nada; melhor não renderizar.\n if (!source) return null;\n const clean = sanitizeSpineMarkdownHtml(parser.parse(source) as string);\n return clean === null ? null : this.#sanitizer.bypassSecurityTrustHtml(clean);\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport {\n AlertComponent,\n ModalComponent,\n SegmentedControlComponent,\n SegmentedOption,\n SkeletonComponent,\n} from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { DocsEntry, DocsGroup, DocsView, SpineDocsService } from './docs.service';\nimport { SpineMarkdownComponent } from './markdown.component';\n\nlet sequence = 0;\n\n/** Compara sem acento e sem caixa. */\nfunction fold(text: string): string {\n return text.normalize('NFD').replace(/\\p{M}/gu, '').toLowerCase();\n}\n\n/**\n * Modal de documentação das telas: índice (com busca) à esquerda e leitura à direita. Montado uma vez\n * pelo `spine-layout`; abrir, fechar e o que se lê vêm todos do `SpineDocsService`.\n */\n@Component({\n selector: 'spine-docs',\n imports: [ModalComponent, AlertComponent, SkeletonComponent, SegmentedControlComponent, SpineMarkdownComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (docs.isOpen()) {\n <hm-modal [heading]=\"text.docs.heading\" size=\"large\" [open]=\"true\" (closed)=\"docs.close()\">\n <div class=\"layout\">\n <nav class=\"index\" [attr.aria-label]=\"text.docs.index\">\n <input\n class=\"filter\"\n type=\"search\"\n [placeholder]=\"text.docs.search\"\n [attr.aria-label]=\"text.docs.search\"\n [value]=\"query()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n @for (group of filtered(); track group.title; let g = $index) {\n <p class=\"group-title\" [id]=\"groupId + g\">{{ group.title }}</p>\n <ul class=\"entries\" [attr.aria-labelledby]=\"groupId + g\">\n @for (entry of group.entries; track entry.id) {\n <li>\n <button\n type=\"button\"\n class=\"entry\"\n [class.entry--active]=\"entry.id === docs.current()?.id\"\n [attr.aria-current]=\"entry.id === docs.current()?.id ? 'true' : null\"\n (click)=\"select(entry)\"\n >\n {{ entry.title }}\n </button>\n </li>\n }\n </ul>\n } @empty {\n <p class=\"note\">{{ query().trim() ? text.docs.noMatch : text.docs.empty }}</p>\n }\n </nav>\n\n <section class=\"reader\">\n @if (docs.current(); as entry) {\n <h3 class=\"reader-title\">{{ entry.title }}</h3>\n @if (docs.showTechnical()) {\n <hm-segmented-control\n [label]=\"text.docs.view\"\n [options]=\"viewOptions()\"\n [value]=\"docs.view()\"\n (valueChange)=\"switchView($event)\"\n />\n }\n <!-- A chave muda com o documento ou a visão: o bloco é recriado e entra de novo. -->\n @for (key of readingKey(); track key) {\n <div class=\"reading\">\n @if (docs.loading()) {\n <hm-skeleton shape=\"text\" [count]=\"6\" [label]=\"text.docs.loading\" />\n } @else if (docs.error()) {\n <hm-alert variant=\"error\">{{ docs.error() }}</hm-alert>\n } @else {\n <spine-markdown [content]=\"docs.content()\" />\n }\n </div>\n }\n } @else {\n <p class=\"note\">{{ text.docs.invite }}</p>\n }\n </section>\n </div>\n </hm-modal>\n }\n `,\n styles: `\n .layout {\n display: grid;\n grid-template-columns: minmax(12rem, 16rem) minmax(0, 1fr);\n gap: var(--hm-space-lg);\n block-size: min(70vh, 48rem);\n min-block-size: 0;\n }\n .index,\n .reader {\n min-block-size: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n }\n .index {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-xs);\n padding-inline-end: var(--hm-space-md);\n border-inline-end: var(--hm-border-hairline) solid var(--hm-divider);\n }\n .filter {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: var(--hm-control-height);\n margin-block-end: var(--hm-space-sm);\n padding-inline: var(--hm-space-sm);\n border: var(--hm-border-hairline) solid var(--hm-border);\n border-radius: var(--hm-radius-control);\n background: var(--hm-surface-raised);\n color: var(--hm-text);\n font: inherit;\n font-size: var(--hm-font-size-sm);\n }\n .filter::placeholder { color: var(--hm-placeholder); }\n .filter:focus-visible {\n outline: var(--hm-border-thin) solid var(--hm-accent);\n outline-offset: var(--hm-border-hairline);\n }\n .group-title {\n margin: var(--hm-space-sm) 0 0;\n color: var(--hm-muted);\n font-size: var(--hm-font-size-xs);\n font-weight: var(--hm-font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .entries {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-micro);\n margin: 0;\n padding: 0;\n list-style: none;\n }\n .entry {\n inline-size: 100%;\n padding: var(--hm-space-xs) var(--hm-space-sm);\n border: var(--hm-border-hairline) solid transparent;\n border-radius: var(--hm-radius-control);\n background: transparent;\n color: var(--hm-text);\n font: inherit;\n font-size: var(--hm-font-size-sm);\n text-align: start;\n cursor: pointer;\n transition: background-color var(--hm-duration-quick) var(--hm-ease);\n }\n .entry:hover { background: var(--hm-hover); }\n .entry:focus-visible {\n outline: var(--hm-border-thin) solid var(--hm-accent);\n outline-offset: calc(var(--hm-border-thin) * -1);\n }\n .entry--active {\n background: var(--hm-accent-subtle);\n color: var(--hm-accent-strong);\n font-weight: var(--hm-font-weight-semibold);\n }\n .reader {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-md);\n align-items: stretch;\n }\n .reader-title {\n margin: 0;\n color: var(--hm-text);\n font-size: var(--hm-font-size-lg);\n font-weight: var(--hm-font-weight-semibold);\n }\n .reading { animation: spine-docs-enter var(--hm-duration-standard) var(--hm-ease-decelerate); }\n .note {\n margin: 0;\n color: var(--hm-muted);\n font-size: var(--hm-font-size-sm);\n }\n @keyframes spine-docs-enter {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @media (max-width: 767px) {\n .layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: minmax(0, 2fr) minmax(0, 3fr);\n }\n .index {\n padding-inline-end: 0;\n padding-block-end: var(--hm-space-md);\n border-inline-end: 0;\n border-block-end: var(--hm-border-hairline) solid var(--hm-divider);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .reading { animation: none; }\n .entry { transition: none; }\n }\n @media (forced-colors: active) {\n .entry--active { border-color: Highlight; }\n }\n `,\n})\nexport class SpineDocsComponent {\n protected readonly docs = inject(SpineDocsService);\n protected readonly text = inject(SPINE_MESSAGES);\n protected readonly query = signal('');\n protected readonly groupId = `spine-docs-group-${++sequence}-`;\n\n protected readonly viewOptions = computed<SegmentedOption<DocsView>[]>(() => [\n { value: 'usage', label: this.text.docs.usage },\n { value: 'technical', label: this.text.docs.technical },\n ]);\n\n protected readonly filtered = computed<DocsGroup[]>(() => {\n const needle = fold(this.query().trim());\n const groups = this.docs.index();\n if (!needle) return groups;\n return groups\n .map((group) => ({\n title: group.title,\n entries: group.entries.filter((entry) => fold(`${entry.title} ${group.title}`).includes(needle)),\n }))\n .filter((group) => group.entries.length > 0);\n });\n\n protected readonly readingKey = computed(() => [`${this.docs.current()?.id ?? ''}:${this.docs.view()}`]);\n\n protected select(entry: DocsEntry): void {\n void this.docs.open(entry);\n }\n\n protected switchView(view: string): void {\n void this.docs.show(view === 'technical' ? 'technical' : 'usage');\n }\n}\n\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { AlertComponent, ButtonComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Aviso discreto de conexão no topo do shell, sobre o `connectionState$` e o `reauthorizationRequired$` do\n * `@orfeu/angular`. A sessão nunca cai por nada disto (sem rede, Argos fora do ar, refresh recusado):\n * a lib segue tentando sozinha e este banner só conta o que está acontecendo.\n *\n * - `offline`: aviso (`warning`) — Argos inalcançável; a lib tenta de novo com backoff e na volta da rede/foco.\n * - `reconnecting` / `reauthorizing`: informativo (`info`), some quando volta a `online`.\n * - `reauthorizationRequired$`: o Argos recusou a renovação e a reautorização automática não aconteceu\n * (desligada, outra aba cuidando ou proteção contra loop). Oferece \"Entrar novamente\", que chama\n * `authorize(urlAtual)` — o login volta para a mesma tela. Nunca chama `logout()`.\n *\n * `hm-alert` em `appearance=\"banner\"` e `size=\"small\"`: faixa de largura total, sem cantos, com os tokens\n * de status do Hermes (`--hm-warning-*`/`--hm-info-*`); `role=\"status\"` (não interrompe o leitor de tela).\n */\n@Component({\n selector: 'spine-connection-banner',\n imports: [AlertComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @switch (notice()) {\n @case ('reauthorizationRequired') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"warning\">\n {{ text.reauthorizationRequired }}\n <hm-button actions emphasis=\"medium\" size=\"small\" icon=\"login\" (clicked)=\"signInAgain()\">{{ text.signInAgain }}</hm-button>\n </hm-alert>\n }\n @case ('offline') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"warning\">{{ text.offline }}</hm-alert>\n }\n @case ('reconnecting') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"info\">{{ text.reconnecting }}</hm-alert>\n }\n @case ('reauthorizing') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"info\">{{ text.reauthorizing }}</hm-alert>\n }\n }\n `,\n styles: [`:host { display: block; flex: none; }`],\n})\nexport class SpineConnectionBannerComponent {\n protected readonly text = inject(SPINE_MESSAGES).session;\n private readonly auth = inject(AuthorizationService);\n private readonly router = inject(Router);\n\n private readonly state = toSignal(this.auth.connectionState$, { initialValue: this.auth.connectionState });\n private readonly reauthRequired = toSignal(this.auth.reauthorizationRequired$, {\n initialValue: this.auth.reauthorizationRequired,\n });\n\n /** O que mostrar: a decisão pendente da pessoa vence o estado da conexão; `online` não mostra nada. */\n protected readonly notice = computed(() => (this.reauthRequired() ? 'reauthorizationRequired' : this.state()));\n\n protected signInAgain(): void {\n void this.auth.authorize(this.router.url);\n }\n}\n","import { Component, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { NavigationEnd, Router, RouterOutlet } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { ToastStackComponent, WorkspaceComponent } from '@trismegisto/angular';\nimport { ModalComponent } from '@trismegisto/spine/modal';\nimport { NotificationComponent } from '@trismegisto/spine/notification';\nimport { SidePanelComponent } from '@trismegisto/spine/side-panel';\nimport { ThemeService, SpinePreferencesService } from '@trismegisto/spine';\nimport { HeaderComponent } from './header/header.component';\nimport { SidebarComponent } from './sidebar/sidebar.component';\nimport { OnboardingOverlayComponent } from './onboarding/onboarding-overlay.component';\nimport { OnboardingService } from './onboarding/onboarding.service';\nimport { SpineNewsComponent } from './news/news.component';\nimport { SpineNewsService } from './news/news.service';\nimport { ShortcutsCheatsheetComponent } from './shortcuts/shortcuts-cheatsheet.component';\nimport { SettingsPanelComponent } from './settings/settings-panel.component';\nimport { SpineSettingsService } from './settings/settings.service';\nimport { ShortcutService } from './shortcuts/shortcut.service';\nimport { SpineWorkspaceNavService } from './workspace/spine-workspace-nav.service';\nimport { SpinePagePanelComponent } from './workspace/spine-page-panel.component';\nimport { PanelLocalLinkDirective } from './workspace/panel-local-link.directive';\nimport { SpineDocsComponent } from './docs/docs-modal.component';\nimport { SpineConnectionBannerComponent } from './connection/connection-banner.component';\nimport { SpineLogoutService } from './logout/logout.service';\n\n/**\n * Shell do spine — MESMA estrutura do `docs/website`'s `app.component.html`/`.scss` (decisão de\n * 2026-09-28, ver `hefesto-migration-plan.md`): `.shell` com altura de viewport de verdade\n * (`100dvh`, não `%` cascateado — `@trismegisto/core` não fixa altura de `html`/`body`, é\n * responsabilidade de quem consome, mesmo tanto quanto o docs faz no próprio `styles.scss`),\n * `hm-header` (utilitários — tema/densidade/apps/perfil, nunca navegação de página) + `.body`\n * (`hm-sidebar` fixa + `.main` com `hm-workspace`). **Sem barra de breadcrumb própria** — isso\n * era resíduo do spine antigo (`spine-navigation`), removido: o docs não tem uma, a navegação\n * inteira mora na sidebar. Entre o header e o corpo fica o `spine-connection-banner` (aviso de conexão\n * do `@orfeu/angular`, vazio quando `online`). Os avisos ficam no `spine-notification` (`NotificationService`) e\n * no `hm-toast-stack` (`HermesToastService`), os dois montados aqui: o app não monta nenhum.\n *\n * O `<router-outlet>` que sobra aqui é só pra `/no-permission` (a única rota do shell com\n * `component` de verdade — o resto da árvore do backend nunca passa pelo `Router` pra renderizar,\n * só pra `ViewGuard` confirmar que a URL resolve). Fica sempre montado (nunca dentro de um `@if`)\n * e escondido via `[hidden]` quando não é a rota ativa — destruir/recriar o outlet num `@if`\n * arriscaria perder a ativação da rota se a navegação e a checagem de `isNoPermission` não\n * corressem na mesma volta de detecção de mudanças.\n */\n@Component({\n selector: 'spine-layout',\n imports: [\n SpineNewsComponent,\n SpineDocsComponent,\n HeaderComponent,\n SidebarComponent,\n SpineConnectionBannerComponent,\n SpinePagePanelComponent,\n PanelLocalLinkDirective,\n WorkspaceComponent,\n ToastStackComponent,\n RouterOutlet,\n ModalComponent,\n NotificationComponent,\n SidePanelComponent,\n OnboardingOverlayComponent,\n ShortcutsCheatsheetComponent,\n SettingsPanelComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"shell\">\n <spine-header></spine-header>\n <!-- Aviso de conexão do @orfeu/angular (offline/reconectando/reautorizando): faixa entre o header e o corpo. -->\n <spine-connection-banner />\n <div class=\"body\">\n @if (!isNoPermission) {\n <spine-sidebar class=\"sidebar\" data-tour=\"nav\"></spine-sidebar>\n }\n <div class=\"main\" role=\"main\">\n <div [hidden]=\"isNoPermission\" class=\"workspace-area\">\n <hm-workspace data-tour=\"tabs\" [keepAlive]=\"true\" [providedStore]=\"workspace.store\" (newTabRequested)=\"workspace.openNewTab($event)\">\n <ng-template #content let-tab let-panelId=\"panelId\" let-active=\"active\">\n <div\n class=\"panel-content\"\n [appPanelLocalLink]=\"panelId !== workspace.focusedPanelId()\"\n (localNavigate)=\"onLocalNavigate(panelId, $event)\"\n >\n <spine-page-panel [url]=\"tab.id\" [isFocusedPanel]=\"active && panelId === workspace.focusedPanelId()\" />\n </div>\n </ng-template>\n </hm-workspace>\n </div>\n <router-outlet></router-outlet>\n </div>\n </div>\n </div>\n <spine-notification></spine-notification>\n <!-- Avisos do HermesToastService (configurações, conta e segurança, auto-serviço…). Se o app também montar\n uma, só uma desenha (o serviço escolhe a pilha ativa): nunca em dobro. -->\n <hm-toast-stack />\n <spine-side-panel />\n <spine-modal />\n <spine-shortcuts-cheatsheet></spine-shortcuts-cheatsheet>\n <spine-settings-panel></spine-settings-panel>\n <spine-docs />\n <spine-news />\n <spine-onboarding-overlay></spine-onboarding-overlay>\n `,\n styles: [`\n :host { display: block; }\n .shell { display: flex; flex-direction: column; height: 100vh; height: 100dvh; background: var(--hm-surface); color: var(--hm-text); }\n .body { position: relative; display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .main { display: flex; flex: 1; min-width: 0; flex-direction: column; }\n /* Abaixo da barra de abas vem a barra de contexto (spine-page-bar, tom elevado), não a folha da\n página: a aba ativa toma o tom dela — o encosto que emenda aba e barra — e a faixa das abas\n inativas fica no outro tom. Só aqui: o padrão do DS (aba ativa = tom da folha) continua valendo\n para quem usa o hm-workspace com o conteúdo direto embaixo. */\n .workspace-area {\n flex: 1; min-height: 0; display: flex; flex-direction: column;\n --hm-tab-strip-bg: var(--hm-surface);\n --hm-tab-active-bg: var(--hm-surface-raised);\n }\n hm-workspace { flex: 1; min-height: 0; }\n /* Sem padding aqui: a barra de contexto (spine-page-bar) ocupa a largura toda do painel; o respiro\n do conteúdo da página é do .spine-page-panel__content (ver spine-page-panel.component.ts). */\n .panel-content { display: flex; flex-direction: column; height: 100%; min-height: 0; }\n `],\n})\nexport class LayoutComponent implements OnInit {\n /** Aplica no boot o idioma e o fuso que a pessoa escolheu nas configurações. */\n private readonly preferences = inject(SpinePreferencesService);\n protected readonly workspace = inject(SpineWorkspaceNavService);\n private readonly settings = inject(SpineSettingsService);\n /** Também liga, uma vez, o aviso de falha do logout (`logoutFailed$` do `@orfeu/angular`). */\n private readonly logoutService = inject(SpineLogoutService);\n\n /** Esconde sidebar e área de trabalho quando a rota ATIVA (do Router real, ver\n * `router.events` abaixo) é a de sem-permissão — nesse caso não existe menu/página válido\n * como contexto. Note que isto reflete só a URL do painel FOCADO (dona do Router real); um\n * painel secundário navegando localmente pra `/no-permission` não passa por aqui — cenário raro\n * o bastante (sem-permissão normalmente bloqueia o app inteiro, não uma aba) pra não justificar\n * mais complexidade agora. */\n public isNoPermission: boolean;\n\n constructor(\n private router: Router,\n private theme: ThemeService,\n private shortcuts: ShortcutService,\n private onboarding: OnboardingService,\n private news: SpineNewsService,\n ) {\n this.isNoPermission = this.matchesNoPermission(this.router.url);\n this.router.events.pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd))\n .subscribe(e => { this.isNoPermission = this.matchesNoPermission(e.urlAfterRedirects); });\n }\n\n private matchesNoPermission(url: string): boolean {\n return url.split(/[?#]/)[0] === '/no-permission';\n }\n\n ngOnInit(): void {\n // Liga os atalhos de teclado globais às ações reais do sistema.\n this.shortcuts.setActions({\n navigate: (url) => this.router.navigateByUrl(url),\n toggleTheme: () => this.theme.setTheme(this.theme.current === 'light' ? 'dark' : 'light'),\n toggleFullscreen: () => this.toggleFullscreen(),\n logout: () => void this.logoutService.logout(),\n openSettings: () => this.settings.toggle(),\n });\n\n // Link direto pra uma seção do painel de configurações: `?settings=aparencia` (ou só\n // `?settings`). Tira o parâmetro da URL depois de abrir — senão ele volta a abrir o painel a\n // cada F5 e acompanha a URL copiada pra outra pessoa.\n const params = new URLSearchParams(window.location.search);\n if (params.has('settings')) {\n this.settings.open(params.get('settings') ?? '');\n void this.router.navigate([], { queryParams: { settings: null }, queryParamsHandling: 'merge', replaceUrl: true });\n }\n\n // Onboarding interativo na primeira entrada nesta máquina. Vem ANTES das novidades: quando devido,\n // o tour fica `pending` na hora, e as novidades (que esperam o tour ficar `idle`) já o enxergam.\n // A ordem inversa também funciona — elas conferem o estado de novo antes de abrir —, mas tour\n // primeiro é o caminho direto.\n this.onboarding.maybeStart();\n // Novidades do app (provideSpineNews): abrem sozinhas uma vez, só depois do tour.\n this.news.scheduleOnEntry();\n }\n\n protected onLocalNavigate(panelId: string, href: string): void {\n this.workspace.navigateLocally(panelId, href);\n }\n\n private toggleFullscreen(): void {\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen?.().catch(() => { /* bloqueado pelo navegador */ });\n } else {\n document.exitFullscreen?.();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i7","HermesHeaderComponent","HermesSidebarComponent","i1.OnboardingService","sequence","i1","i2","i3.ShortcutService","i4.OnboardingService","i5.SpineNewsService","ModalComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-layout.mjs","sources":["../../../projects/ui/layout/src/header/app-launcher.component.ts","../../../projects/ui/layout/src/header/app-launcher.component.html","../../../projects/ui/layout/src/brand.token.ts","../../../projects/ui/layout/src/header/brand.component.ts","../../../projects/ui/layout/src/onboarding/onboarding.service.ts","../../../projects/ui/layout/src/news/news.service.ts","../../../projects/ui/layout/src/logout/logout.service.ts","../../../projects/ui/layout/src/settings/settings.service.ts","../../../projects/ui/layout/src/shortcuts/shortcut.service.ts","../../../projects/ui/layout/src/header/header.component.ts","../../../projects/ui/layout/src/header/header.component.html","../../../projects/ui/layout/src/workspace/spine-workspace-nav.service.ts","../../../projects/ui/layout/src/sidebar/sidebar.component.ts","../../../projects/ui/layout/src/sidebar/sidebar.component.html","../../../projects/ui/layout/src/onboarding/onboarding-placement.ts","../../../projects/ui/layout/src/onboarding/onboarding-overlay.component.ts","../../../projects/ui/layout/src/onboarding/onboarding-overlay.component.html","../../../projects/ui/layout/src/news/news-illustration.ts","../../../projects/ui/layout/src/news/news.component.ts","../../../projects/ui/layout/src/shortcuts/shortcuts-cheatsheet.component.ts","../../../projects/ui/layout/src/shortcuts/shortcuts-cheatsheet.component.html","../../../projects/ui/layout/src/settings/account-security.service.ts","../../../projects/ui/layout/src/account-preferences/account-preferences.service.ts","../../../projects/ui/layout/src/features/spine-features.ts","../../../projects/ui/layout/src/idle/idle.service.ts","../../../projects/ui/layout/src/notices/notices.service.ts","../../../projects/ui/layout/src/start-page/start-page.service.ts","../../../projects/ui/layout/src/settings/account-activity.component.ts","../../../projects/ui/layout/src/settings/account-security.state.ts","../../../projects/ui/layout/src/settings/account-reauth.component.ts","../../../projects/ui/layout/src/settings/account-mfa.component.ts","../../../projects/ui/layout/src/settings/account-mfa.component.html","../../../projects/ui/layout/src/settings/app-tokens.service.ts","../../../projects/ui/layout/src/settings/ai-agent.component.ts","../../../projects/ui/layout/src/settings/default-badge.component.ts","../../../projects/ui/layout/src/settings/account-recovery-codes.component.ts","../../../projects/ui/layout/src/settings/account-sessions.component.ts","../../../projects/ui/layout/src/settings/account-sessions.component.html","../../../projects/ui/layout/src/settings/app-tokens.component.ts","../../../projects/ui/layout/src/settings/app-tokens.component.html","../../../projects/ui/layout/src/settings/settings-panel.component.ts","../../../projects/ui/layout/src/settings/settings-panel.component.html","../../../projects/ui/layout/src/docs/docs.service.ts","../../../projects/ui/layout/src/workspace/spine-page-bar.component.ts","../../../projects/ui/layout/src/workspace/spine-page-panel.component.ts","../../../projects/ui/layout/src/workspace/panel-local-link.directive.ts","../../../projects/ui/layout/src/docs/markdown-sanitize.ts","../../../projects/ui/layout/src/docs/markdown.component.ts","../../../projects/ui/layout/src/docs/docs-modal.component.ts","../../../projects/ui/layout/src/connection/connection-banner.component.ts","../../../projects/ui/layout/src/idle/idle-warning.component.ts","../../../projects/ui/layout/src/layout.component.ts","../../../projects/ui/layout/src/trismegisto-spine-layout.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { AppDef, AuthorizationService, RealmAppsService } from '@orfeu/angular/core';\nimport { IconButtonComponent, IconComponent, LoadingSquareComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * A grade de apps não cabe no `MenuItem` de linha única do `hm-menu` (ícone grande + nome\n * embaixo, em coluna) — em vez de forçar isso num componente pensado pra lista de ações, usa\n * um popover próprio (mesmo padrão do backdrop-fecha-fora da busca global do header).\n */\n@Component({\n selector: 'spine-app-launcher',\n imports: [CommonModule, IconComponent, IconButtonComponent, LoadingSquareComponent],\n templateUrl: './app-launcher.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './app-launcher.component.scss',\n})\nexport class AppLauncherComponent implements OnInit {\n protected readonly text = inject(SPINE_MESSAGES).header;\n private readonly cdr = inject(ChangeDetectorRef);\n\n public apps: AppDef[] = [];\n public loading = false;\n public open = false;\n\n constructor(\n private authService: AuthorizationService,\n private realmAppsService: RealmAppsService,\n ) {}\n\n async ngOnInit(): Promise<void> {\n this.loading = true;\n const token = this.authService.getToken();\n // O client atual (o app em que o usuário já está) já vem excluído aqui —\n // OpenIDController.view no argos filtra por client_id no próprio backend\n // (apps/argos/auth/server/.../openid.controller.ts), então não há\n // necessidade de repetir essa checagem no front.\n try {\n this.apps = (await this.realmAppsService.getApplications(token)) ?? [];\n } catch {\n // Sem a lista não há o que oferecer: o botão some, em vez de ficar carregando para sempre.\n this.apps = [];\n } finally {\n this.loading = false;\n // A lista chega fora de qualquer evento do template: sem isto, app zoneless não redesenha.\n this.cdr.markForCheck();\n }\n }\n\n toggle(): void {\n this.open = !this.open;\n }\n\n close(): void {\n this.open = false;\n }\n}\n","<div class=\"app-launcher-trigger\" data-tour=\"apps\" *ngIf=\"loading || apps.length > 0\">\n <hm-icon-button emphasis=\"subtle\" icon=\"grid\" [label]=\"text.apps\" (clicked)=\"toggle()\"></hm-icon-button>\n\n <button type=\"button\" class=\"app-launcher-backdrop\" *ngIf=\"open\" (click)=\"close()\" aria-hidden=\"true\"></button>\n\n <div class=\"app-launcher-menu\" *ngIf=\"open\">\n <div class=\"app-launcher-header\">{{ text.apps }}</div>\n <div class=\"app-launcher-grid\">\n <div class=\"app-launcher-loading\" *ngIf=\"loading\">\n <hm-loading-square></hm-loading-square>\n </div>\n <a *ngFor=\"let app of apps\" [href]=\"app.app_url\" class=\"app-launcher-card\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <div class=\"app-launcher-icon\">\n <hm-icon shape=\"applications\" size=\"32\"></hm-icon>\n </div>\n <span class=\"app-launcher-name\">{{ app.name }}</span>\n </a>\n </div>\n </div>\n</div>\n","import { InjectionToken, Type } from '@angular/core';\n\n/**\n * Componente de marca que o header do shell desenha no lugar da imagem de `SpineConfig.logo` (tem\n * prioridade sobre ela). Injeção em vez de projeção de conteúdo porque o `LayoutComponent` é montado\n * pelo `Router`, não pelo template do app — não existe `<ng-content>` alcançável de fora. O componente\n * fica dentro do link da marca (que leva à home): não ponha link nem botão nele, e se ele for só\n * imagem, dê nome acessível ou deixe o `appName` visível (`showAppName`, padrão `true`).\n * `null` (padrão) usa a imagem. Ex.: `{ provide: SPINE_BRAND, useValue: MarcaComponent }` no\n * `app.config.ts`.\n */\nexport const SPINE_BRAND = new InjectionToken<Type<unknown> | null>('SPINE_BRAND', {\n providedIn: 'root',\n factory: () => null,\n});\n","import { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { SPINE_CONFIG, ThemeService, resolveSpineLogo } from '@trismegisto/spine';\nimport { SPINE_BRAND } from '../brand.token';\n\n/**\n * Marca do header: logo do app (`SpineConfig.logo`, padrão `assets/images/logo.svg`) + `appName`, dentro\n * de um link para a home. Ordem: componente de `SPINE_BRAND` > imagem > só o nome.\n *\n * - Tema escuro usa `logo.dark` quando houver; se ele falhar, volta para `logo.light`.\n * - Imagem que não carrega (404/erro) some — nada de ícone quebrado — e o nome aparece mesmo com\n * `showAppName: false`, para o link nunca ficar sem texto.\n * - Texto alternativo: `logo.alt` se configurado; senão o `appName` quando o nome está escondido, e vazio\n * (imagem decorativa) quando o nome já está ao lado — o leitor de tela não lê o nome duas vezes.\n */\n@Component({\n selector: 'spine-brand',\n imports: [RouterLink, NgTemplateOutlet, NgComponentOutlet],\n template: `\n @if (homeRoute()) {\n <a class=\"brand\" [routerLink]=\"homeRoute()\" [title]=\"label()\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </a>\n } @else {\n <span class=\"brand\" [title]=\"label()\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </span>\n }\n <ng-template #content>\n @if (brand) {\n <ng-container *ngComponentOutlet=\"brand\" />\n } @else if (src(); as s) {\n <img class=\"brand__logo\" [src]=\"s\" [alt]=\"alt()\" (error)=\"onError(s)\" />\n }\n @if (nameVisible()) {\n <span class=\"brand__name\">{{ appName }}</span>\n }\n </ng-template>\n `,\n styleUrl: './brand.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SpineBrandComponent {\n /** Rota da home (primeira rota navegável); `null` desenha a marca sem link. */\n readonly homeRoute = input<string | null>(null);\n /** Dica do link (ex.: \"Página inicial\"). */\n readonly label = input('');\n\n private readonly config = inject(SPINE_CONFIG, { optional: true });\n private readonly theme = inject(ThemeService);\n protected readonly brand = inject(SPINE_BRAND);\n protected readonly appName = this.config?.appName ?? 'Hermes';\n private readonly sources = resolveSpineLogo(this.config?.logo);\n private readonly showAppName = this.config?.showAppName !== false;\n /** Endereços que já deram erro nesta sessão do componente. */\n private readonly failed = signal<ReadonlySet<string>>(new Set());\n\n /** Imagem a mostrar agora (tema atual, sem as que falharam); `null` = nenhuma. */\n readonly src = computed<string | null>(() => {\n const logo = this.sources;\n if (!logo || this.brand) return null;\n const failed = this.failed();\n if (this.theme.current === 'dark' && logo.dark && !failed.has(logo.dark)) return logo.dark;\n return failed.has(logo.light) ? null : logo.light;\n });\n\n readonly nameVisible = computed(() => this.showAppName || (!this.brand && !this.src()));\n\n readonly alt = computed(() => this.sources?.alt ?? (this.nameVisible() ? '' : this.appName));\n\n onError(src: string): void {\n if (this.failed().has(src)) return;\n this.failed.update((set) => new Set(set).add(src));\n }\n}\n","import { Inject, Injectable, Optional, inject } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { SPINE_CONFIG, SpineConfig, SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Fase do tour: `idle` (inativo: não é devido, terminou, foi pulado/interrompido ou não sobrou passo),\n * `pending` (vai aparecer: desde o `maybeStart()`/`restart()` até o primeiro passo, enquanto espera o\n * shell e os alvos) e `running` (um passo na tela). Quem não pode disputar a tela com o tour (o painel\n * de novidades) espera `idle` — não um tempo fixo.\n */\nexport type OnboardingState = 'idle' | 'pending' | 'running';\n\nexport interface OnboardingStep {\n /** seletor CSS do alvo; ausente = passo centralizado (boas-vindas/encerramento). */\n target?: string;\n title: string;\n /** pode conter HTML simples (<b>). */\n description: string;\n}\n\n// Entra na chave de \"já visto\": trocar a versão faz o tour aparecer de novo para todo mundo.\nconst ONBOARDING_VERSION = 'v3';\n\n// Espera antes de procurar os alvos na entrada automática: header/breadcrumb renderizados.\nconst START_DELAY_MS = 700;\n\n// Partes do shell chegam depois do login (abas, barra de página): o tour espera por elas, mas não\n// para sempre. Os passos cujo alvo não apareceu no prazo ficam de fora.\nconst TARGET_WAIT_MS = 3000;\nconst TARGET_POLL_MS = 150;\n\n/**\n * Primeiro elemento do seletor que está de fato na tela (tem tamanho e conteúdo). Não usa\n * `offsetParent`: ele é `null` pra `position: fixed` (a sidebar) e pra `display: contents`, e o\n * passo sumia do tour mesmo com o alvo visível. Com as abas vivas do workspace há uma barra de\n * página por aba — só a da aba ativa tem tamanho, e é ela que o holofote precisa achar.\n */\nexport function findTourTarget(selector: string): HTMLElement | null {\n for (const el of Array.from(document.querySelectorAll<HTMLElement>(selector))) {\n const r = el.getBoundingClientRect();\n if (r.width > 0 && r.height > 0 && el.children.length > 0) return el;\n }\n return null;\n}\n\n/**\n * Onboarding interativo próprio (sem dependência externa). O overlay/holofote e o\n * balão são renderizados pelo OnboardingOverlayComponent, que escuta este serviço.\n * Aparece uma vez por máquina (flag em localStorage), namespaced por cliente.\n */\n@Injectable({ providedIn: 'root' })\nexport class OnboardingService {\n private readonly text = inject(SPINE_MESSAGES).tour;\n /** Passo atual (null = tour inativo). O overlay component reage a isto. */\n public readonly current$ = new BehaviorSubject<{\n step: OnboardingStep;\n index: number;\n total: number;\n } | null>(null);\n\n private readonly stateSubject = new BehaviorSubject<OnboardingState>('idle');\n /** Fase do tour (ver `OnboardingState`). Emite o valor atual ao assinar. */\n public readonly state$: Observable<OnboardingState> = this.stateSubject.asObservable();\n /** Fase atual, síncrona. */\n get state(): OnboardingState { return this.stateSubject.value; }\n\n private readonly doneKey: string;\n private steps: OnboardingStep[] = [];\n private index = 0;\n private waiting: ReturnType<typeof setTimeout> | null = null;\n\n constructor(@Optional() @Inject(SPINE_CONFIG) config: SpineConfig | null) {\n const ns = config?.clientId ?? 'app';\n this.doneKey = `${ns}_onboarding_${ONBOARDING_VERSION}`;\n }\n\n private get done(): boolean {\n try { return localStorage.getItem(this.doneKey) === 'done'; } catch { return true; }\n }\n private markDone(): void {\n try { localStorage.setItem(this.doneKey, 'done'); } catch { /* sem localStorage → não insiste */ }\n }\n\n /**\n * Dispara o tour só se ainda não foi visto nesta máquina. Chamar após o login. Quando é devido, o\n * estado vira `pending` NA HORA (síncrono), antes da espera pelo shell — é isso que segura as\n * novidades; quando não é, continua `idle`. Chamar de novo com o tour já em andamento não faz nada.\n */\n maybeStart(): void {\n if (this.done || this.state !== 'idle') return;\n this.setState('pending');\n this.clearWaiting();\n this.waiting = setTimeout(() => this.start(), START_DELAY_MS);\n }\n\n /** Reabre o tour manualmente (menu Ajuda), ignorando a flag. Também passa por `pending` → `running`. */\n restart(): void {\n this.setState('pending');\n this.start();\n }\n\n /**\n * Interrompe o tour (pendente ou na tela) SEM marcar como visto: o automático volta na próxima entrada.\n * Usado quando a pessoa abre outra coisa que disputaria a tela com ele (as novidades pelo menu).\n */\n stop(): void {\n if (this.state === 'idle') return;\n this.clearWaiting();\n this.current$.next(null);\n this.setState('idle');\n }\n\n /** Passos no idioma ativo (o texto é lido do catálogo ao começar o tour). Descrições com `<b>`. */\n private allSteps(): OnboardingStep[] {\n const t = this.text;\n return [\n { title: t.welcomeTitle, description: t.welcomeText },\n { target: '[data-tour=\"apps\"]', title: t.appsTitle, description: t.appsText },\n { target: '[data-tour=\"search\"]', title: t.searchTitle, description: t.searchText },\n { target: '[data-tour=\"nav\"] .hm-sidebar__content', title: t.navModulesTitle, description: t.navModulesText },\n { target: '[data-tour=\"nav\"] .hm-sidebar__footer', title: t.navModeTitle, description: t.navModeText },\n { target: '[data-tour=\"tabs\"] hm-tab-bar', title: t.tabsTitle, description: t.tabsText },\n { target: '[data-tour=\"tabs\"]', title: t.splitTitle, description: t.splitText },\n { target: '[data-tour=\"breadcrumb\"]', title: t.whereTitle, description: t.whereText },\n { target: '[data-tour=\"theme\"]', title: t.themeTitle, description: t.themeText },\n { target: '[data-tour=\"density\"]', title: t.densityTitle, description: t.densityText },\n { target: '[data-tour=\"fullscreen\"]', title: t.fullscreenTitle, description: t.fullscreenText },\n { target: '[data-tour=\"profile\"]', title: t.profileTitle, description: t.profileText },\n { title: t.doneTitle, description: t.doneText },\n ];\n }\n\n /**\n * Começa do primeiro passo assim que todos os alvos estão na tela, ou no fim do prazo só com os passos\n * que têm alvo visível (e os sem alvo). Sem nenhum passo, só marca como visto. Não bloqueia: confere\n * de novo a cada `TARGET_POLL_MS`.\n */\n private start(): void {\n this.clearWaiting();\n const steps = this.allSteps();\n const present = (step: OnboardingStep) => !step.target || findTourTarget(step.target) !== null;\n\n const attempt = (waited: number): void => {\n if (!steps.every(present) && waited < TARGET_WAIT_MS) {\n this.waiting = setTimeout(() => attempt(waited + TARGET_POLL_MS), TARGET_POLL_MS);\n return;\n }\n this.waiting = null;\n this.steps = steps.filter(present);\n this.index = 0;\n if (!this.steps.length) {\n this.markDone();\n this.setState('idle');\n return;\n }\n this.emit();\n this.setState('running');\n };\n attempt(0);\n }\n\n private emit(): void {\n this.current$.next({ step: this.steps[this.index], index: this.index, total: this.steps.length });\n }\n\n private setState(state: OnboardingState): void {\n if (this.stateSubject.value !== state) this.stateSubject.next(state);\n }\n\n private clearWaiting(): void {\n if (this.waiting !== null) clearTimeout(this.waiting);\n this.waiting = null;\n }\n\n next(): void {\n if (this.index >= this.steps.length - 1) { this.finish(); return; }\n this.index++;\n this.emit();\n }\n\n prev(): void {\n if (this.index <= 0) return;\n this.index--;\n this.emit();\n }\n\n /** Encerra o tour (concluído ou pulado) e marca como visto. */\n finish(): void {\n this.clearWaiting();\n this.markDone();\n this.current$.next(null);\n this.setState('idle');\n }\n\n get isFirst(): boolean { return this.index === 0; }\n get isLast(): boolean { return this.index === this.steps.length - 1; }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SPINE_CONFIG, SPINE_NEWS, SpineNewsItem, SpineNewsSlide } from '@trismegisto/spine';\nimport { filter, take } from 'rxjs';\nimport { OnboardingService } from '../onboarding/onboarding.service';\n\n/** Intervalo entre o fim do tour (ou a entrada, sem tour) e o painel de novidades, para os dois não se\n * emendarem na tela. */\nconst AFTER_TOUR_MS = 800;\n\n/**\n * Painel de novidades do app (ver `provideSpineNews`). Decide o que está devido — ainda não visto\n * NESTE navegador e ainda dentro do `until` — e abre sozinho uma vez, depois do tour de boas-vindas.\n * O \"já visto\" é por app (`hermes_<clientId>_news_seen`): novidade de um app não some por ter sido\n * vista em outro no mesmo domínio.\n *\n * Tour e novidades nunca dividem a tela: na entrada, as novidades esperam o tour ficar `idle` (ver\n * `OnboardingState`); fora dela, vale a última ação explícita da pessoa — o tour reaberto pelo menu\n * Ajuda fecha o painel de novidades, e as novidades abertas pelo menu interrompem o tour (sem marcá-lo\n * como visto).\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineNewsService {\n private readonly onboarding = inject(OnboardingService);\n private readonly items: readonly SpineNewsItem[] = (inject(SPINE_NEWS, { optional: true }) ?? []).flat();\n private readonly seenKey: string;\n\n /** Slides em exibição (os devidos, ou todos os vigentes quando reaberto pelo menu). */\n readonly slides = signal<readonly SpineNewsSlide[]>([]);\n readonly isOpen = signal(false);\n /** Há alguma novidade vigente — o item \"Novidades\" do menu só aparece com isto. */\n readonly hasAny = computed(() => this.current().length > 0);\n\n constructor() {\n const ns = inject(SPINE_CONFIG, { optional: true })?.clientId;\n this.seenKey = `${ns ? `hermes_${ns}` : 'hermes'}_news_seen`;\n\n // O tour (re)começando — inclusive pelo menu Ajuda — fecha o painel: ele é a ação mais recente.\n this.onboarding.state$\n .pipe(filter((state) => state === 'pending'), takeUntilDestroyed())\n .subscribe(() => this.close());\n }\n\n /**\n * Chamado uma vez pelo layout na entrada: abre as devidas quando o tour estiver `idle` (não devido,\n * concluído, pulado ou sem passo), mais `AFTER_TOUR_MS` para não emendar. Se o tour começar nesse\n * intervalo, volta a esperar — por isso a ordem com `OnboardingService.maybeStart()` não importa,\n * desde que ele seja chamado dentro desse intervalo (o layout chama os dois juntos, tour primeiro).\n */\n scheduleOnEntry(): void {\n if (this.due().length === 0) return;\n const whenIdle = (): void => {\n this.onboarding.state$.pipe(filter((state) => state === 'idle'), take(1)).subscribe(() => {\n setTimeout(() => {\n if (this.onboarding.state !== 'idle') whenIdle();\n else this.showDue();\n }, AFTER_TOUR_MS);\n });\n };\n whenIdle();\n }\n\n /** Marca como vistas todas as novidades devidas e as abre num único painel. */\n showDue(): void {\n const due = this.due();\n if (due.length === 0) return;\n this.markSeen(due.map((i) => i.id));\n this.open(due);\n }\n\n /**\n * Reabre todas as vigentes (menu do perfil), vistas ou não; as devidas entre elas passam a vistas.\n * Interrompe o tour se ele estiver pendente ou na tela (ação mais recente da pessoa).\n */\n showAll(): void {\n const all = this.current();\n if (all.length === 0) return;\n this.onboarding.stop();\n const due = this.due();\n if (due.length) this.markSeen(due.map((i) => i.id));\n this.open(all);\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n private open(items: readonly SpineNewsItem[]): void {\n const slides = items.flatMap((i) => i.slides);\n if (slides.length === 0) return;\n this.slides.set(slides);\n this.isOpen.set(true);\n }\n\n /** Vigentes: sem `until`, ou com `until` ainda não passado (comparação por data, AAAA-MM-DD). */\n private current(): readonly SpineNewsItem[] {\n const today = new Date().toISOString().slice(0, 10);\n return this.items.filter((i) => !i.until || today <= i.until);\n }\n\n private due(): readonly SpineNewsItem[] {\n const seen = this.readSeen();\n return this.current().filter((i) => !seen.has(i.id));\n }\n\n private readSeen(): Set<string> {\n try {\n return new Set(JSON.parse(localStorage.getItem(this.seenKey) || '[]') as string[]);\n } catch {\n return new Set();\n }\n }\n\n private markSeen(ids: readonly string[]): void {\n try {\n const seen = this.readSeen();\n ids.forEach((id) => seen.add(id));\n localStorage.setItem(this.seenKey, JSON.stringify([...seen]));\n } catch {\n /* sem localStorage: mostra de novo na próxima entrada, sem quebrar nada */\n }\n }\n}\n","import { DestroyRef, Injectable, inject, signal } from '@angular/core';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { SPINE_MESSAGES, SpineUserStorage } from '@trismegisto/spine';\nimport { AlertType, NotificationService } from '@trismegisto/spine/notification';\n\n/** Tempo do aviso de falha na tela (segundos). */\nconst LOGOUT_FAILED_SECONDS = 8;\n\n/** O que o spine usa do `AuthorizationService`, nas duas linhas do `@orfeu/angular`: na 1.0.x `logout()` não\n * devolve nada e não existe `logoutFailed$`; da 1.3.0 em diante devolve `Promise<boolean>` e há `logoutFailed$`. */\ninterface LogoutCapable {\n logout(): unknown;\n logoutFailed$?: { subscribe(next: () => void): { unsubscribe(): void } };\n}\n\n/**\n * Saída da sessão pelo shell: todo botão/atalho de sair do spine passa por aqui (menu do perfil, painel de\n * configurações, `Mod+Shift+L`, tela `/blocked`).\n *\n * - Assina `logoutFailed$` do `@orfeu/angular` (1.3.x) uma vez só: quando o logout no Argos falha (a lib repete uma\n * vez e mantém a sessão), mostra o aviso de erro `session.logoutFailed` (`hm-alert` de erro, `role=\"alert\"`). Vale\n * também para um `logout()` chamado direto pelo app.\n * - `logout()` aguarda o resultado: só apaga os históricos do usuário (`SpineUserStorage.clearHistory()`) quando a\n * saída deu certo. Com falha, nada muda: a pessoa continua na tela, com a sessão e os recentes.\n * - `pending` fica `true` enquanto a saída está em andamento e sempre volta a `false` (os botões não travam).\n *\n * Com `@orfeu/angular` 1.0.x (sem `logoutFailed$`, `logout()` sem retorno) a saída conta como concluída, como antes.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineLogoutService {\n private readonly auth = inject(AuthorizationService) as unknown as LogoutCapable;\n private readonly userStorage = inject(SpineUserStorage);\n private readonly notifications = inject(NotificationService);\n private readonly messages = inject(SPINE_MESSAGES);\n /** `true` quando a lib avisa a falha por `logoutFailed$` (então o aviso sai por lá, uma vez). */\n private readonly failureStream: boolean;\n private inFlight: Promise<boolean> | null = null;\n\n /** Saída em andamento (o botão mostra \"saindo…\" / fica desabilitado). */\n readonly pending = signal(false);\n\n constructor() {\n const failed$ = this.auth.logoutFailed$;\n this.failureStream = typeof failed$?.subscribe === 'function';\n if (!this.failureStream) return;\n const sub = failed$!.subscribe(() => this.notifyFailure());\n inject(DestroyRef).onDestroy(() => sub.unsubscribe());\n }\n\n /**\n * Sai da sessão. Resolve `true` quando saiu (o `@orfeu/angular` já navega para o `/logoff`) e `false` quando o\n * Argos não confirmou: a sessão continua e o aviso de erro aparece. Nunca rejeita. Cliques repetidos durante a\n * saída reaproveitam a mesma tentativa.\n */\n logout(): Promise<boolean> {\n this.inFlight ??= this.run().finally(() => {\n this.inFlight = null;\n this.pending.set(false);\n });\n return this.inFlight;\n }\n\n private async run(): Promise<boolean> {\n this.pending.set(true);\n // Guarda de quem é a sessão antes de sair: depois do logout o token some, e a limpeza precisa do usuário.\n this.userStorage.userId();\n let ok: boolean;\n let rejected = false;\n try {\n // 1.3.x: Promise<boolean>; 1.0.x: void (a saída local sempre acontecia).\n ok = (await this.auth.logout()) !== false;\n } catch {\n ok = false;\n rejected = true;\n }\n if (ok) {\n this.userStorage.clearHistory();\n } else if (rejected || !this.failureStream) {\n // Sem `logoutFailed$` para avisar (ou a chamada nem chegou a resolver): o próprio resultado avisa.\n this.notifyFailure();\n }\n return ok;\n }\n\n private notifyFailure(): void {\n this.notifications.addNotification({\n timer: LOGOUT_FAILED_SECONDS,\n hermesAlertType: AlertType.DANGER,\n message: this.messages.session.logoutFailed,\n hermesAlertClosable: true,\n });\n }\n}\n","import { InjectionToken, Injectable, Provider, Type, signal } from '@angular/core';\n\n/** Seções que o próprio spine já traz. `key` é também o valor de `?settings=` na URL. */\nexport const SPINE_SETTINGS_KEYS = {\n appearance: 'aparencia',\n /** Tamanho do texto e animações. */\n accessibility: 'acessibilidade',\n region: 'regiao',\n shortcuts: 'atalhos',\n /** Novidades e tour guiado. */\n help: 'ajuda',\n /** Tipos de aviso do app e aviso do navegador (`SpineFeatures.notices`). */\n notices: 'notificacoes',\n /** Listas guardadas neste navegador (recentes, buscas, favoritos) e restaurar preferências. */\n data: 'dados',\n account: 'conta',\n /** Verificação em duas etapas e códigos de recuperação (API da conta do Argos). */\n mfa: 'mfa',\n /** Sessão atual, token de acesso, tokens de aplicação e sessões e dispositivos. */\n sessions: 'sessoes',\n /** @deprecated A seção \"Conta e segurança\" virou \"MFA\" e \"Sessões\": `seguranca` abre a de MFA (ver\n * `SPINE_SETTINGS_ALIASES`). Use `mfa` ou `sessions`. */\n security: 'seguranca',\n about: 'sobre',\n} as const;\n\n/** Chaves antigas de `?settings=` que continuam abrindo a seção que as substituiu (links já publicados). */\nexport const SPINE_SETTINGS_ALIASES: Readonly<Record<string, string>> = {\n [SPINE_SETTINGS_KEYS.security]: SPINE_SETTINGS_KEYS.mfa,\n};\n\n/** Chave de seção que vale hoje: troca uma chave antiga pela nova; as demais passam iguais. */\nexport function resolveSettingsSection(section: string): string {\n // hasOwn: `?settings=constructor` não pode devolver o que vem do protótipo.\n return Object.hasOwn(SPINE_SETTINGS_ALIASES, section) ? SPINE_SETTINGS_ALIASES[section] : section;\n}\n\n/** Seção extra do painel, registrada pelo app (ex.: preferências de deploy do hefesto). */\nexport interface SpineSettingsSection {\n /** Identificador estável; também o que `?settings=<key>` abre. Não repetir os do spine. */\n key: string;\n label: string;\n /** Ícone do hermes-icon na navegação. */\n icon?: string;\n description?: string;\n /** Termos extras que acham a seção inteira na busca. */\n keywords?: string;\n /** Conteúdo da seção — de preferência `hm-settings-row`s, para a busca achar cada linha. */\n component: Type<unknown>;\n}\n\nexport const SPINE_SETTINGS_SECTIONS = new InjectionToken<SpineSettingsSection[]>('SPINE_SETTINGS_SECTIONS');\n\n/** Registra uma seção do app no painel de configurações (aparece depois das do spine, antes de\n * \"Sobre\"). Pode ser chamado várias vezes, uma por seção. */\nexport function provideSettingsSection(section: SpineSettingsSection): Provider {\n return { provide: SPINE_SETTINGS_SECTIONS, useValue: section, multi: true };\n}\n\n/** Abre/fecha o painel de configurações de qualquer lugar (menu do perfil, atalho, link). */\n@Injectable({ providedIn: 'root' })\nexport class SpineSettingsService {\n readonly isOpen = signal(false);\n /** Seção pedida na abertura (vazio = a primeira). */\n readonly section = signal('');\n\n /** `section` aceita também as chaves antigas (`seguranca` abre \"MFA\"). */\n open(section = ''): void {\n this.section.set(resolveSettingsSection(section));\n this.isOpen.set(true);\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n toggle(): void {\n if (this.isOpen()) this.close();\n else this.open();\n }\n}\n","import { Injectable, OnDestroy, computed, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { HERMES_MESSAGES, HermesShortcut, HermesShortcutItem, HermesShortcutService } from '@trismegisto/angular';\nimport { SPINE_MESSAGES, SPINE_USER_STORAGE_KEYS, SpineUserStorage } from '@trismegisto/spine';\n\n/** Grupo do painel de atalhos. Id estável; o nome exibido vem do catálogo da lib (`shortcuts.groups`). */\nexport type ShortcutGroupId = 'navigation' | 'actions' | 'general';\n\n/** Item exibido no painel de atalhos (cheatsheet, aberto com \"?\"). */\nexport interface ShortcutItem {\n /** Teclas já em texto, na plataforma atual (`'Ctrl + K'`, `'⌘K'`, `'G depois H'`). */\n keys: string;\n description: string;\n group: ShortcutGroupId;\n}\n\n/** Atalhos agrupados, já com o nome do grupo no idioma ativo. */\nexport interface ShortcutGroup {\n id: ShortcutGroupId;\n name: string;\n items: ShortcutItem[];\n}\n\n/** Ações concretas que o atalho dispara — ligadas pelo LayoutComponent. */\nexport interface ShortcutActions {\n navigate?: (url: string) => void; // navega para uma rota (ex.: '/home', favorito)\n toggleTheme?: () => void; // alterna claro/escuro\n toggleFullscreen?: () => void; // tela cheia\n logout?: () => void; // sair\n openSettings?: () => void; // painel de configurações\n}\n\n/** `G 1` … `G 9`: um registro só (o dígito sai do evento); a referência identifica o item no painel. */\nconst FAVORITE_KEYS: readonly string[] = Array.from({ length: 9 }, (_, i) => `G ${i + 1}`);\n/** Como os favoritos aparecem no painel: uma linha \"G depois 1…9\" em vez de nove alternativas. */\nconst FAVORITE_DISPLAY_KEYS = 'G 1…9';\n\n/**\n * Atalhos de teclado globais do sistema, sobre o `HermesShortcutService` da lib (um listener só,\n * sequência `G H`, conflito, campo editável, interruptor de tecla única da WCAG 2.1.4).\n *\n * `setActions` registra os atalhos do shell: `G H` (Home), `G 1`…`G 9` (favoritos), `Mod+,`\n * (configurações), `Mod+.` (tema), `Mod+Shift+F` (tela cheia), `Mod+Shift+L` (sair) e `?` (painel\n * de atalhos, via `help$`). Os combos com `Mod` valem também com o foco num campo; `G …` e `?`, não.\n *\n * O painel (`spine-shortcuts-cheatsheet` e a seção Atalhos das configurações) usa o\n * `hm-shortcut-list` com `panelItems()`: tudo o que está registrado no `HermesShortcutService`\n * (inclusive o que o app liga com `[hmShortcut]`) mais o que o spine só exibe e outra peça dispara\n * (`Mod+K` do `hm-header`, `Alt+←/→` do navegador, `Esc` dos diálogos).\n */\n@Injectable({ providedIn: 'root' })\nexport class ShortcutService implements OnDestroy {\n private actions: ShortcutActions = {};\n private removers: (() => void)[] = [];\n private readonly userStorage = inject(SpineUserStorage);\n private readonly hermes = inject(HermesShortcutService);\n private readonly lib = inject(HERMES_MESSAGES);\n private readonly text = inject(SPINE_MESSAGES).shortcuts;\n\n /** Emite quando o usuário pede o painel de atalhos (tecla \"?\" ou menu do perfil). */\n public readonly help$ = new Subject<void>();\n\n /** Teclas (referência) → descrição viva, para o painel acompanhar a troca de idioma. */\n private readonly own = new Map<string | readonly string[], () => string>();\n\n /** Os atalhos do shell. `describe` lê o catálogo na hora (o idioma pode mudar depois do registro). */\n private definitions(): (Omit<HermesShortcut, 'description'> & { describe: () => string })[] {\n const t = this.text;\n return [\n { keys: ['G H'], describe: () => t.goHome, group: 'navigation', handler: () => this.navigate('/home') },\n { keys: FAVORITE_KEYS, describe: () => t.goFavorite, group: 'navigation', handler: (e) => this.goToFavorite(e) },\n { keys: ['Mod+,'], describe: () => t.openSettings, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.openSettings) },\n { keys: ['Mod+.'], describe: () => t.toggleTheme, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.toggleTheme) },\n { keys: ['Mod+Shift+F'], describe: () => t.fullscreen, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.toggleFullscreen) },\n { keys: ['Mod+Shift+L'], describe: () => t.logout, group: 'actions', allowInInputs: true, handler: () => this.call(this.actions.logout) },\n { keys: ['?'], describe: () => t.showHelp, group: 'general', handler: () => this.help$.next() },\n ];\n }\n\n /** Só exibidos: quem dispara é outra peça (hm-header, navegador, diálogos). */\n private displayOnly(): HermesShortcutItem[] {\n const t = this.text;\n return [\n { keys: 'Mod+K', description: t.openSearch, group: 'navigation' },\n { keys: ['Alt+Left', 'Alt+Right'], description: t.history, group: 'navigation' },\n { keys: 'Esc', description: t.closeOverlay, group: 'general' },\n ];\n }\n\n /**\n * O que o painel lista (`<hm-shortcut-list [registered]=\"false\" [items]=\"panelItems()\">`): os\n * atalhos registrados no `HermesShortcutService`, com os favoritos numa linha só, e os só exibidos.\n * Acompanha registro/remoção e a troca de idioma do catálogo da lib.\n */\n public readonly panelItems = computed<readonly HermesShortcutItem[]>(() => {\n const registered = this.hermes.list().map((item) => {\n const describe = this.own.get(item.keys);\n if (!describe) return item;\n return { ...item, description: describe(), keys: item.keys === FAVORITE_KEYS ? FAVORITE_DISPLAY_KEYS : item.keys };\n });\n const display = this.displayOnly();\n // Ordem do painel antigo: busca e histórico abrem a navegação, Esc fecha o geral.\n return [display[0], ...registered, display[1], display[2]];\n });\n\n /**\n * Lista do painel em texto, no idioma e na plataforma atuais.\n * @deprecated Use o `hm-shortcut-list` com `panelItems()` (ou `HermesShortcutService.list()`).\n * Mantido para quem montava o próprio painel; sai numa próxima versão.\n */\n public get shortcuts(): ShortcutItem[] {\n return this.panelItems().map((item) => ({\n keys: this.keysText(item.keys),\n description: item.description,\n group: toSpineGroup(item.group),\n }));\n }\n\n /**\n * Atalhos por grupo, na ordem navegação → ações → geral, com o nome do grupo traduzido.\n * @deprecated Use o `hm-shortcut-list` (agrupa, traduz e desenha as teclas). Sai numa próxima versão.\n */\n public groups(): ShortcutGroup[] {\n const all = this.shortcuts;\n return (['navigation', 'actions', 'general'] as const)\n .map((id) => ({ id, name: this.hermes.groupName(id), items: all.filter((s) => s.group === id) }))\n .filter((g) => g.items.length);\n }\n\n /** Liga as ações e registra os atalhos no `HermesShortcutService` (idempotente: chamadas seguintes só trocam as ações). */\n setActions(actions: ShortcutActions): void {\n this.actions = { ...this.actions, ...actions };\n if (this.removers.length) return;\n this.removers = this.definitions().map(({ describe, ...definition }) => {\n // Teclas sempre em lista própria: a referência identifica o registro do spine no painel.\n this.own.set(definition.keys, describe);\n const remove = this.hermes.register({ ...definition, description: describe() });\n return () => {\n remove();\n this.own.delete(definition.keys);\n };\n });\n }\n\n ngOnDestroy(): void {\n this.removers.forEach((remove) => remove());\n this.removers = [];\n }\n\n // ── interno ────────────────────────────────────────────────────────────────\n\n /** Ação ausente devolve `false`: o evento segue sem `preventDefault` (o navegador faz o dele). */\n private call(fn?: () => void): boolean {\n if (!fn) return false;\n fn();\n return true;\n }\n\n private navigate(url: string): boolean {\n return this.call(this.actions.navigate && (() => this.actions.navigate!(url)));\n }\n\n /** Navega para o N-ésimo favorito (1-based) lido da store da navegação; N = o dígito do evento. */\n private goToFavorite(event: KeyboardEvent): boolean {\n const digit = /^[1-9]$/.test(event.key) ? event.key : /^Digit([1-9])$/.exec(event.code)?.[1];\n if (!digit) return false;\n let url: string | null = null;\n try {\n const list = JSON.parse(localStorage.getItem(this.userStorage.key(SPINE_USER_STORAGE_KEYS.favorites)) || '[]');\n const fav = Array.isArray(list) ? list[Number(digit) - 1] : null;\n url = fav?.redirect || (typeof fav?.id === 'string' && fav.id.startsWith('/') ? fav.id : null);\n } catch { /* store inválida → ignora */ }\n return url ? this.navigate(url) : false;\n }\n\n /** Texto corrido das teclas para a API antiga (`shortcuts`): \"Ctrl + K\", \"G depois H\", \"… ou …\". */\n private keysText(keys: string | readonly string[]): string {\n const { then, or } = this.lib.shortcuts;\n const join = this.hermes.platform === 'mac' ? '' : ' + ';\n return this.hermes\n .format(keys)\n .map((steps) => steps.map((step) => step.map((key) => key.label).join(join)).join(` ${then} `))\n .join(` ${or} `);\n }\n}\n\nfunction toSpineGroup(group: string | undefined): ShortcutGroupId {\n return group === 'navigation' || group === 'actions' ? group : 'general';\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, ElementRef, Injector, OnInit, Optional, Inject, Type, ViewChild, afterNextRender, inject, ChangeDetectionStrategy } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { filter, take } from 'rxjs';\nimport { AuthorizationService, UserProfile, ViewService } from '@orfeu/angular/core';\nimport {\n AccountAvatarComponent,\n HeaderComponent as HermesHeaderComponent,\n IconButtonComponent,\n IconComponent,\n InputComponent,\n MenuButtonComponent,\n MenuItem,\n ModalComponent,\n} from '@trismegisto/angular';\nimport { DensityService, Route, SPINE_CONFIG, SPINE_USER_STORAGE_KEYS, SpineConfig, SpineUserStorage, ThemePresetService, ThemeService, SPINE_MESSAGES, spineRoutesOf } from '@trismegisto/spine';\nimport { AppLauncherComponent } from './app-launcher.component';\nimport { SpineBrandComponent } from './brand.component';\nimport { OnboardingService } from '../onboarding/onboarding.service';\nimport { SpineNewsService } from '../news/news.service';\nimport { ShortcutService } from '../shortcuts/shortcut.service';\nimport { SpineLogoutService } from '../logout/logout.service';\nimport { SpineSettingsService, SPINE_SETTINGS_KEYS } from '../settings/settings.service';\nimport { formatMessage } from '@trismegisto/primitives';\n\n/** Item achatado da árvore de rotas, usado pela busca global (quick-launcher). */\ninterface QuickItem { name: string; icon: string; redirect: string; path: string; }\n\nconst MAX_RECENT_SEARCH = 6;\n\n@Component({\n selector: 'spine-header',\n imports: [\n CommonModule, FormsModule,\n HermesHeaderComponent, IconButtonComponent, IconComponent, InputComponent, MenuButtonComponent, AccountAvatarComponent, ModalComponent,\n AppLauncherComponent, SpineBrandComponent,\n ],\n templateUrl: './header.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './header.component.scss',\n})\nexport class HeaderComponent implements OnInit {\n\n public isFullscreen = !!document.fullscreenElement;\n public element = document.documentElement;\n public headerBlocked = false;\n /** route_redirect da primeira rota navegável da view atual — usado pela marca do header.\n * null quando a view não tem nenhuma rota (nesse caso a marca não é link). */\n public homeRoute: string | null = null;\n /** Nome do app (SpineConfig.appName; padrão \"Hermes\") — quem desenha é o `spine-brand`. */\n protected readonly appName: string;\n\n private readonly injector = inject(Injector);\n protected readonly text = inject(SPINE_MESSAGES).header;\n protected readonly fmt = formatMessage;\n private readonly settings = inject(SpineSettingsService);\n private readonly news = inject(SpineNewsService);\n private readonly userStorage = inject(SpineUserStorage);\n private readonly logoutService = inject(SpineLogoutService);\n /** Por usuário (`SpineUserStorage`): `<clientId>_header_recent_searches_<sub>`; apagada no logout. */\n private get recentSearchKey(): string {\n return this.userStorage.key(SPINE_USER_STORAGE_KEYS.recentSearches);\n }\n\n constructor(\n private authService: AuthorizationService,\n protected themeService: ThemeService,\n protected themePresetService: ThemePresetService,\n protected densityService: DensityService,\n private viewService: ViewService,\n private router: Router,\n private onboarding: OnboardingService,\n private shortcuts: ShortcutService,\n @Optional() @Inject(SPINE_CONFIG) config: SpineConfig | null,\n ) {\n this.appName = config?.appName ?? 'Hermes';\n // Lista apagada fora daqui (logout, Configurações › Dados do navegador) ou outra conta: relê, para a\n // próxima busca não ressuscitar o que foi apagado.\n const stop = this.userStorage.onChange(() => (this.recentSearches = this.loadRecent()));\n inject(DestroyRef).onDestroy(stop);\n }\n\n async ngOnInit(): Promise<void> {\n this.updateView(this.viewService.currentView);\n this.viewService.currentView$.subscribe((data: any) => this.updateView(data));\n\n // Depois de trocar de badge, a view/rotas mudam — sem isso o usuário fica\n // parado numa rota que pode não existir mais pro badge novo. Se o badge novo\n // não tiver nenhuma view disponível, manda pro no-permission em vez de travar.\n //\n // badgeChanged$ dispara ANTES do ViewService.currentView ser atualizado\n // (AuthorizationService.switchBadge emite o evento em applyToken() e só\n // depois faz `await view.update(token)`), então não dá pra usar\n // currentView na hora do evento — ele ainda é a view do badge anterior.\n // Por isso esperamos a próxima emissão *diferente* de currentView$ antes\n // de decidir o redirect.\n this.authService.badgeChanged$.subscribe(() => {\n const staleView = this.viewService.currentView;\n this.viewService.currentView$\n .pipe(filter((v: any) => v !== staleView), take(1))\n .subscribe((data: any) => {\n const firstRoute = this.findFirstNavigable(spineRoutesOf(data));\n this.router.navigate([firstRoute ?? '/no-permission']);\n });\n });\n\n this.recentSearches = this.loadRecent();\n }\n\n updateView(data: any) {\n const routes = spineRoutesOf(data);\n this.quickIndex = this.flattenRoutes(routes, []);\n this.homeRoute = this.findFirstNavigable(routes);\n }\n\n /** Primeira rota navegável (DFS), atravessando grupos \"transparentes\" sem route_redirect. */\n private findFirstNavigable(routes: Route[]): string | null {\n for (const r of routes || []) {\n if (!r) continue;\n if (r.route_redirect) return r.route_redirect;\n if (r.routes?.length) {\n const found = this.findFirstNavigable(r.routes as Route[]);\n if (found) return found;\n }\n }\n return null;\n }\n\n setTheme(theme: 'light' | 'dark') {\n this.themeService.setTheme(theme);\n }\n\n setDensity() { this.densityService.toggleDensity(); }\n get isCompactDensity(): boolean { return this.densityService.current.name === 'compact'; }\n\n toggleFullscreen() {\n if (!document.fullscreenElement) {\n this.element.requestFullscreen()\n .then(() => { this.isFullscreen = true; })\n .catch(err => console.error(`Erro ao ativar tela cheia: ${err.message}`));\n } else {\n document.exitFullscreen()\n .then(() => { this.isFullscreen = false; })\n .catch(err => console.error(`Erro ao sair da tela cheia: ${err.message}`));\n }\n }\n\n get badge() { return this.authService.badge; }\n get badges() { return this.authService.badges; }\n get profile(): UserProfile { return this.authService.profile; }\n\n async switchBadge(badgeTypeId: string): Promise<void> {\n await this.authService.switchBadge(badgeTypeId);\n }\n\n /** Sai pelo `SpineLogoutService`: com falha no Argos a pessoa fica aqui, com aviso, e o histórico fica. */\n logout(): Promise<boolean> {\n return this.logoutService.logout();\n }\n\n /** Reabre o tour guiado de onboarding. */\n startTour() { this.onboarding.restart(); }\n\n /** Abre o painel de atalhos de teclado. */\n openShortcuts() { this.shortcuts.help$.next(); }\n\n /** Menu do perfil: achatado (badges, se houver mais de um, + ações), já que `hm-menu`\n * não tem submenu aninhado como o `hermes-dropdown` antigo tinha para a troca de crachá. */\n get profileMenuItems(): MenuItem[] {\n const items: MenuItem[] = [];\n // Vários níveis de acesso: um item que abre um segundo menu (MenuItem.children) em vez de listar\n // todos os níveis direto no menu do perfil.\n if (this.badges.length > 1) {\n items.push({\n id: 'badges',\n label: this.text.accessLevels,\n icon: 'shield-check',\n children: this.badges.map(b => ({ id: `badge:${b.id}`, label: b.name, icon: 'shield-check', disabled: b.id === this.badge?.id })),\n });\n }\n items.push({ id: 'settings', label: this.text.settings, icon: 'cog', separatorAbove: items.length > 0 });\n items.push({ id: 'theme', label: this.text.appearance, icon: 'color-palette' });\n items.push({ id: 'shortcuts', label: this.text.shortcuts, icon: 'keyboard' });\n items.push({ id: 'tour', label: this.text.tour, icon: 'play' });\n // Só quando o app registrou alguma novidade vigente (provideSpineNews).\n if (this.news.hasAny()) items.push({ id: 'news', label: this.text.news, icon: 'star' });\n // Desabilitado só enquanto a saída está em andamento; volta sozinho se ela falhar.\n items.push({ id: 'logout', label: this.text.logout, icon: 'logout', danger: true, separatorAbove: true, disabled: this.logoutService.pending() });\n return items;\n }\n\n onProfileMenuChosen(id: string): void {\n if (id.startsWith('badge:')) { void this.switchBadge(id.slice('badge:'.length)); return; }\n switch (id) {\n case 'tour': this.startTour(); return;\n case 'news': this.news.showAll(); return;\n case 'shortcuts': this.openShortcuts(); return;\n case 'settings': this.settings.open(); return;\n // \"Aparência\" abre o painel direto na seção (era o modal de tema, que virou parte dela).\n case 'theme': this.settings.open(SPINE_SETTINGS_KEYS.appearance); return;\n case 'logout': void this.logout(); return;\n }\n }\n\n // ─── Busca global (quick-launcher) ──────────────────────────────────────────\n @ViewChild('quickBox') quickBox?: ElementRef<HTMLElement>;\n public quickQuery = '';\n public quickOpen = false;\n public quickResults: QuickItem[] = [];\n public quickActive = 0;\n private quickIndex: QuickItem[] = [];\n /** Histórico de buscas (mostrado ao focar com o campo vazio). */\n public recentSearches: QuickItem[] = [];\n /** Verdadeiro quando o painel está exibindo o histórico (campo vazio). */\n public showingRecent = false;\n\n /** Achata a árvore de rotas em itens navegáveis (com trilha de ancestrais). */\n private flattenRoutes(routes: Route[], trail: string[]): QuickItem[] {\n const skip = new Set(['search', 'theme', 'logout']);\n const out: QuickItem[] = [];\n for (const r of routes || []) {\n if (!r) continue;\n const name = r.route_display_name || '';\n if (r.route_redirect && name && !skip.has(r.route_type as string)) {\n out.push({ name, icon: r.route_icon || 'application', redirect: r.route_redirect, path: trail.join(' › ') });\n }\n if (r.routes?.length) out.push(...this.flattenRoutes(r.routes as Route[], name ? [...trail, name] : trail));\n }\n return out;\n }\n\n /** Chamado pelo `(searchRequested)` do `hm-header` (clique no campo ou `Ctrl K`, já tratado\n * internamente por ele) — abre o modal de busca, mesmo padrão do `docs/website`\n * (`openSearch()` em `app.component.ts`: `@if` monta o `hm-modal` só quando aberto). */\n onSearchRequested(): void {\n this.quickQuery = '';\n this.quickOpen = true;\n this.onQuickSearch();\n // O `#quickBox` (e o input do hm-input dentro dele) só existe no DOM depois do `@if`/`hm-modal` montarem — foca assim que\n // a próxima renderização terminar (mesmo problema documentado em WorkspaceNavService: query\n // de view não existe antes do primeiro ciclo depois do `@if` virar true).\n afterNextRender(() => this.quickBox?.nativeElement?.querySelector('input')?.focus(), { injector: this.injector });\n }\n\n /** `(openChange)` do `hm-modal` — fecha ao clicar fora/Esc/botão de fechar. */\n onQuickModalOpenChange(open: boolean): void {\n this.quickOpen = open;\n if (!open) {\n this.quickQuery = '';\n this.quickResults = [];\n this.showingRecent = false;\n }\n }\n\n onQuickSearch() {\n const q = (this.quickQuery || '').trim().toLowerCase();\n this.quickActive = 0;\n // Campo vazio: mostra o histórico (recalculado na hora, para refletir as\n // últimas navegações) em vez de nada.\n if (!q) {\n this.showingRecent = true;\n this.recentSearches = this.loadRecent();\n this.quickResults = this.recentSearches.slice(0, 8);\n return;\n }\n this.showingRecent = false;\n const seen = new Set<string>();\n this.quickResults = this.quickIndex\n .filter((x) => (x.name.toLowerCase().includes(q) || x.path.toLowerCase().includes(q)))\n .filter((x) => (seen.has(x.redirect) ? false : (seen.add(x.redirect), true)))\n .slice(0, 8);\n }\n\n quickGo(item: QuickItem) {\n if (!item?.redirect) return;\n this.pushRecent(item);\n this.onQuickModalOpenChange(false);\n this.router.navigateByUrl(item.redirect);\n }\n\n quickMove(delta: number) {\n if (!this.quickResults.length) return;\n this.quickActive = (this.quickActive + delta + this.quickResults.length) % this.quickResults.length;\n }\n\n // ─── Histórico de buscas ────────────────────────────────────────────────────\n private readJson(key: string): any[] {\n try { const v = JSON.parse(localStorage.getItem(key) || '[]'); return Array.isArray(v) ? v : []; }\n catch { return []; }\n }\n\n private loadRecent(): QuickItem[] {\n return this.readJson(this.recentSearchKey)\n .filter((x) => x?.redirect && x?.name)\n .map((x) => ({ name: x.name, icon: x.icon || 'application', redirect: x.redirect, path: x.path || '' }))\n .slice(0, MAX_RECENT_SEARCH);\n }\n private pushRecent(item: QuickItem) {\n const entry: QuickItem = { name: item.name, icon: item.icon || 'application', redirect: item.redirect, path: item.path || '' };\n const next = [entry, ...this.recentSearches.filter((x) => x.redirect !== entry.redirect)].slice(0, MAX_RECENT_SEARCH);\n this.recentSearches = next;\n try { localStorage.setItem(this.recentSearchKey, JSON.stringify(next)); } catch { /* storage cheio/indisponível */ }\n }\n clearRecent(event?: Event) {\n event?.preventDefault();\n event?.stopPropagation();\n this.recentSearches = [];\n try { localStorage.removeItem(this.recentSearchKey); } catch { /* noop */ }\n this.quickResults = [];\n }\n}\n","<hm-header [class.header-blocked]=\"headerBlocked\" (searchRequested)=\"onSearchRequested()\">\n <div *ngIf=\"headerBlocked\" class=\"header-overlay\"></div>\n\n <spine-app-launcher></spine-app-launcher>\n\n <!-- Marca: logo do app (SpineConfig.logo, padrão assets/images/logo.svg) + SpineConfig.appName,\n levando à primeira rota navegável. Ver SpineBrandComponent. -->\n <spine-brand [homeRoute]=\"homeRoute\" [label]=\"text.home\" />\n\n <div actions class=\"h-right\">\n <!-- tema claro/escuro -->\n <hm-icon-button emphasis=\"subtle\" data-tour=\"theme\" (clicked)=\"setTheme(themeService.current == 'light' ? 'dark' : 'light')\"\n [icon]=\"themeService.current == 'light' ? 'moon' : 'sun'\"\n [label]=\"themeService.current == 'light' ? text.themeDark : text.themeLight\">\n </hm-icon-button>\n\n <!-- densidade -->\n <hm-icon-button emphasis=\"subtle\" data-tour=\"density\" (clicked)=\"setDensity()\"\n [icon]=\"isCompactDensity ? 'density-comfortable' : 'density-compact'\"\n [label]=\"isCompactDensity ? text.densityComfortable : text.densityCompact\">\n </hm-icon-button>\n\n <!-- tela cheia -->\n <hm-icon-button emphasis=\"subtle\" data-tour=\"fullscreen\" (clicked)=\"toggleFullscreen()\"\n [icon]=\"isFullscreen ? 'shrink' : 'resize'\"\n [label]=\"isFullscreen ? text.exitFullscreen : text.fullscreen\">\n </hm-icon-button>\n\n <span class=\"h-divider\" aria-hidden=\"true\"></span>\n\n <!-- perfil: crachá, ajuda, tema e sair ficam dentro do menu -->\n <hm-menu-button class=\"h-profile\" data-tour=\"profile\" [label]=\"profile.name ?? text.user\" align=\"end\" [items]=\"profileMenuItems\" (chosen)=\"onProfileMenuChosen($event)\">\n <hm-account-avatar [name]=\"profile.name ?? text.user\" [imageUrl]=\"profile.picture\"></hm-account-avatar>\n <span class=\"h-profile-info\">\n <span class=\"h-profile-name\">{{ profile.name ?? text.user }}</span>\n <span class=\"h-profile-role\" *ngIf=\"badge\">{{ badge?.name }}</span>\n </span>\n </hm-menu-button>\n </div>\n</hm-header>\n\n<!-- Busca global (quick-launcher) — mesmo padrão do docs/website: modal aberto por\n (searchRequested), não um overlay próprio sempre presente no DOM. -->\n@if (quickOpen) {\n <hm-modal [open]=\"quickOpen\" (openChange)=\"onQuickModalOpenChange($event)\" [heading]=\"text.search\" size=\"medium\">\n <!-- Mesmo padrão da busca do design system: hm-input + lista simples (nome · onde). Setas/Enter navegam. -->\n <div class=\"search\" data-tour=\"search\" #quickBox\n (keydown.arrowdown)=\"$event.preventDefault(); quickMove(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); quickMove(-1)\"\n (keydown.enter)=\"quickGo(quickResults[quickActive])\">\n <hm-input [label]=\"text.search\" [placeholder]=\"text.searchPlaceholder\" icon=\"search\"\n [(ngModel)]=\"quickQuery\" (ngModelChange)=\"onQuickSearch()\" />\n\n @if (showingRecent && quickResults.length) {\n <div class=\"search__recent\">\n <span>{{ text.recentSearches }}</span>\n <button type=\"button\" (mousedown)=\"clearRecent($event)\">{{ text.clearRecent }}</button>\n </div>\n }\n @if (quickResults.length) {\n <ul class=\"search__results\">\n @for (r of quickResults; track $index; let i = $index) {\n <li>\n <button type=\"button\" [class.active]=\"i === quickActive\" (mouseenter)=\"quickActive = i\" (mousedown)=\"quickGo(r)\">\n <strong><hm-icon [shape]=\"showingRecent ? 'history' : r.icon\" />{{ r.name }}</strong>\n @if (r.path) { <span>{{ r.path }}</span> }\n </button>\n </li>\n }\n </ul>\n } @else if (quickQuery) {\n <p class=\"search__empty\">{{ fmt(text.noResults, { term: quickQuery }) }}</p>\n }\n </div>\n </hm-modal>\n}\n\n","import { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { ViewService } from '@orfeu/angular/core';\nimport {\n HERMES_WORKSPACE_PERSISTENCE_CONFIG,\n TabItem,\n WorkspaceState,\n WorkspaceStore,\n createPersistedWorkspaceStore,\n findPanelTabs,\n} from '@trismegisto/angular';\nimport { Route, spineRoutesOf } from '@trismegisto/spine';\nimport { resolveEffectiveRouteChain } from '@trismegisto/spine/routing';\n\nconst HOME_PATH = '/home';\n\n/**\n * Dono do `WorkspaceStore` do shell — mesmo padrão do `WorkspaceNavService` do docs/website\n * (`packages/hermes-ui/docs/website/src/app/workspace-nav.service.ts`), adaptado pra ler a\n * árvore de rotas do BACKEND (`ViewService.currentView`) em vez de um `page-registry.ts`\n * estático. Cada página visitada vira uma aba, pertencente a um painel; a navegação real do\n * `Router` (routerLink, busca, sidebar) sempre atualiza a aba ativa do painel FOCADO.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineWorkspaceNavService {\n private readonly router = inject(Router);\n private readonly viewService = inject(ViewService);\n\n readonly store: WorkspaceStore = createPersistedWorkspaceStore(\n { tabs: [this.tabFor(HOME_PATH)], activeId: HOME_PATH },\n (id) => (this.chainFor(id) ? this.tabFor(id) : null),\n inject(HERMES_WORKSPACE_PERSISTENCE_CONFIG),\n );\n\n private readonly state = signal<WorkspaceState>(this.store.getState());\n readonly root = computed(() => this.state().root);\n readonly focusedPanelId = computed(() => this.state().focusedPanelId);\n\n /** Cadeia resolvida (header→…→page) da aba ativa do painel FOCADO — é o que `spine-sidebar`\n * (menu) e `spine-navigation` (breadcrumb) leem pra saber \"onde estamos\", no lugar do antigo\n * `viewService.logControl$`/`breadCrumb$` globais (que só existiam porque havia uma página\n * \"atual\" só; agora cada painel tem a sua). */\n readonly focusedChain = computed<Route[] | null>(() => {\n const s = this.state();\n const activeId = findPanelTabs(s.root, s.focusedPanelId)?.activeId;\n return activeId ? this.chainFor(activeId) : null;\n });\n\n private lastKnownPath = '';\n\n constructor() {\n this.store.subscribe((s) => this.state.set(s));\n\n this.router.events.subscribe((event) => {\n if (!(event instanceof NavigationEnd)) return;\n const path = event.urlAfterRedirects.split(/[?#]/)[0] || HOME_PATH;\n this.lastKnownPath = path;\n this.store.navigateActiveTab(this.state().focusedPanelId, this.tabFor(event.urlAfterRedirects));\n });\n\n // Mesma corrida documentada no WorkspaceNavService do docs/website: pula a 1ª execução, senão\n // o estado inicial (hardcoded ou recém-restaurado do sessionStorage) vence a navegação real\n // (mais lenta, resolve async) e qualquer link direto/F5 cai sempre em HOME_PATH.\n let first = true;\n effect(() => {\n const s = this.state();\n const activeId = findPanelTabs(s.root, s.focusedPanelId)?.activeId;\n if (first) {\n first = false;\n return;\n }\n if (!activeId || activeId === this.lastKnownPath) return;\n this.lastKnownPath = activeId;\n void this.router.navigateByUrl(activeId);\n });\n }\n\n /** Resolve a cadeia de rotas pra uma URL, direto na view atual — sem `Router`, sem `async`\n * (o componente da folha só é carregado por quem for de fato desenhar o painel). Desce sozinho\n * por nós organizacionais (com filhos, sem conteúdo próprio) — o rótulo/ícone da aba e o que a\n * sidebar/breadcrumb mostram refletem o destino DE VERDADE, não a rota-container clicada. */\n private chainFor(url: string): Route[] | null {\n const currentRoutes = spineRoutesOf(this.viewService.currentView);\n return resolveEffectiveRouteChain(\n currentRoutes,\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n }\n\n tabFor(url: string): TabItem {\n const path = url.split(/[?#]/)[0] || HOME_PATH;\n const leaf = this.chainFor(path)?.at(-1);\n return {\n id: path,\n label: leaf?.route_display_name ?? path,\n icon: leaf?.route_icon ?? undefined,\n };\n }\n\n /** O `+` de um painel: abre a home ali, como um navegador. */\n openNewTab(panelId: string): void {\n this.store.openTab(panelId, this.tabFor(HOME_PATH));\n }\n\n /** Navegação LOCAL a um painel específico (usada pelo `PanelLocalLinkDirective`) — troca o\n * ASSUNTO da aba ativa daquele painel, não empilha uma aba nova. */\n navigateLocally(panelId: string, href: string): void {\n this.store.navigateActiveTab(panelId, this.tabFor(href));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, signal, ChangeDetectionStrategy } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, NavigationSkipped, Router } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AppDef, AuthorizationService, RealmAppsService, ViewService } from '@orfeu/angular/core';\nimport { IconComponent, SidebarComponent as HermesSidebarComponent, SidebarNode, SidebarNodeComponent } from '@trismegisto/angular';\nimport { Route, routerIdOf, SPINE_MESSAGES, spineRoutesOf } from '@trismegisto/spine';\nimport { SpineWorkspaceNavService } from '../workspace/spine-workspace-nav.service';\nimport { formatMessage } from '@trismegisto/primitives';\n\n/**\n * `Route` (árvore do backend) → `SidebarNode` (genérico, o que `hm-sidebar-node` sabe desenhar).\n * Sem filtrar por `route_type`: a árvore real mistura tipos livremente por PAPEL, não por\n * profundidade fixa (achado real, 2026-09-28, com a árvore de verdade em mãos — 'menu'/'item'/\n * 'submenu'/'page' aparecem intercalados; um nó 'item' pode ter filhos 'submenu' que têm filhos\n * 'page', por exemplo \"Sistema\"). `hm-sidebar-node` já decide sozinho link-vs-grupo pela presença\n * de filhos + profundidade restante — não precisa saber o `route_type` pra nada.\n */\nfunction toSidebarNode(route: Route): SidebarNode {\n return {\n // Página: o router (a tela); grupo (sem router próprio): a rota.\n id: routerIdOf(route) ?? route.routed_id,\n label: route.route_display_name ?? '',\n icon: route.route_icon ?? undefined,\n route: route.route_redirect ?? '',\n children: (route.routes ?? []).map(toSidebarNode),\n };\n}\n\n/**\n * Menu lateral fixo — TODA a navegação do shell mora aqui agora, nunca no header (decisão\n * explícita do usuário: \"não deve ter ícones de navegação no menu superior, deve ter um menu\n * lateral de navegação fixa\" — o antigo `h-nav`/`hm-menu-button` de nível 'header'/'menu' do\n * `header.component.html` foi removido, essa navegação virou `modules` abaixo).\n *\n * Dois níveis, um de cada vez — MESMO padrão de back/forward do `docs/website`'s sidebar (achado\n * real, 2026-09-28: a primeira versão mostrava os dois SEMPRE juntos, empilhados, achando que o\n * modelo de rotas do backend não permitia \"sair\" de um módulo — errado; nada impede mostrar só um\n * nível por vez com um botão de voltar, é só um `signal` local):\n * - `modules` (nível 1, 'header', de `ViewService.currentView` direto — não muda com a navegação\n * do painel): a lista pra trocar de módulo.\n * - `menus`: a cadeia resolvida da aba ativa do painel FOCADO\n * (`SpineWorkspaceNavService.focusedChain`) — os itens do módulo ATUAL.\n * `viewingModules` decide qual dos dois aparece; volta pra `false` sozinho sempre que o módulo\n * atual muda (navegação real feita, mesma UX do `leaveModule()` do docs).\n */\n@Component({\n selector: 'spine-sidebar',\n imports: [CommonModule, HermesSidebarComponent, SidebarNodeComponent, IconComponent],\n templateUrl: './sidebar.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [`\n /* Aplicações (só no mobile): o seletor de apps do header some abaixo de 768px e vem para a sidebar. */\n .spine-sidebar-apps { display: none; }\n @media (max-width: 767px) {\n .spine-sidebar-apps {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-micro);\n margin-bottom: var(--hm-space-sm);\n padding-bottom: var(--hm-space-sm);\n border-bottom: var(--hm-border-hairline) solid var(--hm-divider);\n }\n .spine-sidebar-apps__title {\n display: flex;\n align-items: center;\n gap: var(--hm-space-nano);\n margin: 0 var(--hm-space-xxxs);\n color: var(--hm-muted);\n font-size: var(--hm-font-size-xs);\n font-weight: var(--hm-font-weight-semibold);\n letter-spacing: 0.04em;\n text-transform: uppercase;\n }\n .spine-sidebar-apps__link {\n display: flex;\n align-items: center;\n gap: var(--hm-space-nano);\n min-height: var(--hm-space-2xl);\n padding: var(--hm-space-nano) var(--hm-space-xxxs);\n border-radius: var(--hm-radius-control);\n color: inherit;\n font-size: var(--hm-font-size-sm);\n text-decoration: none;\n }\n .spine-sidebar-apps__link:hover,\n .spine-sidebar-apps__link:focus-visible { background: var(--hm-hover); }\n }\n\n /* Achado real, 2026-09-28: \\`hm-sidebar\\` (a TAG) é \\`display: contents\\` no @trismegisto/core\n * (repassa os filhos pro pai, sem caixa própria) — \\`height\\` nela não faz NADA, por spec CSS\n * (display:contents não gera caixa principal, propriedade de tamanho é ignorada). Quem\n * realmente precisa da altura é \\`.hm-sidebar\\` (a classe, o <nav> de verdade lá dentro) — e\n * ele só recebe de verdade se ESTE host também tiver altura definida (senão \"100%\" de um pai\n * com altura automática também não é nada). Era isto que sobrava como espaço em branco: o\n * <nav> ficava do tamanho do próprio conteúdo, mas o layout ao redor já reservava a coluna\n * inteira pro sidebar.\n *\n * Segunda rodada do MESMO bug, achada ao vivo 2026-09-28 (barra branca sobrevivia ao fix\n * acima, \\`height:100%\\` sem efeito nenhum medido no DOM real): a regra \\`.hm-sidebar\\` deste\n * bloco NUNCA bateu no \\`<nav class=\"hm-sidebar\">\\` de verdade. Motivo: encapsulamento emulado\n * do Angular tagueia cada seletor com o atributo \\`_ngcontent\\` do componente DONO do template\n * onde o elemento nasce — e o \\`<nav class=\"hm-sidebar\">\\` nasce dentro do template do\n * \\`HermesSidebarComponent\\` (\\`@trismegisto/angular\\`, seletor \\`hm-sidebar\\`), não do template\n * deste \\`SidebarComponent\\` do spine. \\`<hm-sidebar>\\` (a TAG, que É filha direta do template\n * daqui) recebe o atributo certo; o \\`<nav>\\` que \\`display:contents\\` \"promove\" pra cima, não —\n * então \\`.hm-sidebar[_ngcontent-spine-x]\\` vira um seletor que não existe em lugar nenhum do\n * DOM real, silenciosamente inerte. \\`::ng-deep\\` é o jeito suportado de escrever uma regra sem\n * esse atributo, alcançando de fato o DOM interno de um componente filho.\n *\n * E o que essa regra precisa fazer: \\`.hm-sidebar\\` no \\`_sidebar.scss\\` do core tem\n * \\`flex: none\\` — certo pro caso comum (filho de um flex EM LINHA, onde só a LARGURA deve ser\n * travada por \\`width\\`/\\`min-width\\`/\\`max-width\\`, nunca deve \"crescer\"). Mas aqui \\`:host\\` é um\n * flex EM COLUNA — nesse eixo, \\`flex: none\\` também zera \\`flex-grow\\`, então o <nav> (único\n * item do eixo vertical) nunca cresce pra preencher o restante da coluna. \\`flex-grow: 1\\`\n * reforça o preenchimento pelo eixo certo (altura) sem tocar a LARGURA (eixo cruzado, continua\n * só sob controle de width/min-width/max-width do core) — escopado só no spine (\\`:host\\` na\n * frente), o core continua \\`flex: none\\` pra quem usa \\`hm-sidebar\\` direto num flex em linha\n * (docs/website, hefesto sem o wrapper de coluna). */\n :host { display: flex; flex-direction: column; height: 100%; }\n :host ::ng-deep .hm-sidebar { height: 100%; flex-grow: 1; }\n `],\n})\nexport class SidebarComponent {\n protected readonly text = inject(SPINE_MESSAGES).sidebar;\n protected readonly fmt = formatMessage;\n private readonly workspace = inject(SpineWorkspaceNavService);\n private readonly viewService = inject(ViewService);\n private readonly authService = inject(AuthorizationService);\n private readonly realmApps = inject(RealmAppsService);\n\n /** Aplicações do realm (o app atual já vem excluído pelo backend) — exibidas só no mobile. */\n protected readonly apps = signal<AppDef[]>([]);\n\n private readonly currentView = toSignal(this.viewService.currentView$, { initialValue: this.viewService.currentView });\n /** Sem nenhum crachá (nenhum grupo do app — ver `ViewGuard`, tela `/blocked`), o menu fica vazio\n * mesmo que a view traga rotas públicas: listar o que leva de volta ao \"Acesso bloqueado\" não\n * ajuda. `badges` não é sinal, mas a view sempre é refeita depois do token (`view.update`), e é\n * ela que recalcula isto. */\n protected readonly modules = computed<SidebarNode[]>(() => {\n // Irmãos de mesmo endereço já fundidos: um \"laboratorio\" só, não um por nível (ver `mergeRouteTree`).\n const routes = spineRoutesOf(this.currentView());\n if (this.authService.authenticated && !this.authService.badges.length) return [];\n return routes.map(toSidebarNode);\n });\n\n protected readonly currentModule = computed<Route | null>(() => this.workspace.focusedChain()?.[0] ?? null);\n\n /** Filhos diretos do módulo atual — sem filtrar por `route_type` (ver `toSidebarNode`). */\n protected readonly menus = computed<SidebarNode[]>(() => (this.currentModule()?.routes ?? []).map(toSidebarNode));\n\n /** Nem todo nível 1 é um \"módulo\" navegável — \"Início\"/\"Monitoração\" na árvore real são\n * `route_type: 'page'` SEM filhos, folhas diretas (achado real, 2026-09-28: mostravam\n * cabeçalho + botão voltar + área de conteúdo vazia, como se fossem módulos de verdade). Só\n * entra no modo \"dentro do módulo\" quando há algo pra mostrar como submenu. */\n protected readonly currentModuleHasChildren = computed(() => (this.currentModule()?.routes?.length ?? 0) > 0);\n\n /** `true` = mostrando a lista de módulos; `false` = mostrando o menu do módulo atual. Cai pra\n * `true` sozinho quando o módulo atual não tem submenu nenhum — nesse caso não existe \"dentro\n * do módulo\" pra mostrar. */\n private readonly wantsModules = signal(false);\n protected readonly viewingModules = computed(() => this.wantsModules() || !this.currentModuleHasChildren());\n\n /** Sem teto artificial de nível de grupo — o template não enxerga o global `Infinity`, só\n * membros da classe. Ver comentário no `.html`: o backend já limita a árvore sozinho. */\n protected readonly maxDepth = Infinity;\n\n constructor() {\n void this.realmApps.getApplications(this.authService.getToken()).then(\n list => this.apps.set(list ?? []),\n () => this.apps.set([]), // sem a lista, o bloco de aplicações só não aparece\n );\n\n // Navegou de verdade (clicou num módulo, ou entrou direto por link/F5) -> volta pro menu do\n // módulo novo. Só faz sentido reagir à IDENTIDADE do módulo (router da página ou, num grupo, a\n // rota -- módulo costuma ser grupo, sem router próprio), não ao objeto inteiro\n // (a cadeia inteira muda a cada troca de aba dentro do MESMO módulo também).\n let lastModuleId: string | null | undefined;\n effect(() => {\n const module = this.currentModule();\n const id = module ? routerIdOf(module) ?? module.routed_id : null;\n if (id !== lastModuleId) {\n lastModuleId = id;\n this.wantsModules.set(false);\n }\n });\n\n // O efeito acima não cobre voltar pro MESMO módulo: dentro de \"Sistema\", \"← Módulos\" e\n // clicar em \"Sistema\" de novo navega (a rota muda), mas a identidade do módulo é a mesma — o\n // efeito não dispara e a lista de módulos ficava na tela (achado real, 2026-09-29: só\n // funcionava passando por outro módulo antes). Qualquer navegação concluída é um \"entrar\".\n // NavigationSkipped também: clicar no módulo cuja página já está aberta cai no ViewGuard\n // (`/sys` cancela e redireciona pra `/sys/about/resources`), e o redirect pra URL ATUAL é\n // descartado pelo Router como \"mesma URL\" — não emite NavigationEnd nenhum.\n inject(Router).events.pipe(\n filter(e => e instanceof NavigationEnd || e instanceof NavigationSkipped),\n takeUntilDestroyed(),\n ).subscribe(() => this.wantsModules.set(false));\n }\n\n protected showModules(): void {\n this.wantsModules.set(true);\n }\n}\n","<hm-sidebar\n *ngIf=\"modules().length != 0 || menus().length != 0\"\n [label]=\"!viewingModules() && currentModule() ? fmt(text.moduleNavigation, { module: currentModule()!.route_display_name ?? '' }) : text.modules\"\n [heading]=\"!viewingModules() ? (currentModule()?.route_display_name ?? '') : ''\"\n [headingIcon]=\"currentModule()?.route_icon ?? 'grid'\"\n [backLabel]=\"!viewingModules() && modules().length > 1 ? text.modules : ''\"\n [direction]=\"viewingModules() ? 'back' : 'forward'\"\n (back)=\"showModules()\"\n>\n <!-- Só no mobile: o seletor de aplicações do header some e vem para cá. -->\n @if (apps().length) {\n <section class=\"spine-sidebar-apps\" [attr.aria-label]=\"text.apps\">\n <p class=\"spine-sidebar-apps__title\"><hm-icon shape=\"grid\" /> {{ text.apps }}</p>\n @for (app of apps(); track app.app_url) {\n <a class=\"spine-sidebar-apps__link\" [href]=\"app.app_url\" target=\"_blank\" rel=\"noopener noreferrer\">\n <hm-icon shape=\"applications\" />\n <span>{{ app.name }}</span>\n </a>\n }\n </section>\n }\n @if (viewingModules()) {\n @for (m of modules(); track m.id) {\n <hm-sidebar-node [node]=\"m\" [depth]=\"0\" />\n }\n } @else {\n @for (menu of menus(); track menu.id) {\n <!-- Infinity, não um número fixo: o backend do spine já usa `route_type` pra limitar a\n árvore a 6 níveis (header→navigation→menu→item→submenu→page — ver `route.model.ts`),\n então não há necessidade de um segundo teto aqui. Um teto baixo (achado ao vivo,\n 2026-09-28: `depth=2`) forçava o penúltimo nível a virar link plano mesmo tendo\n filhos reais (ex.: \"submenu\" com páginas embaixo sumia da árvore visível). -->\n <hm-sidebar-node [node]=\"menu\" [depth]=\"maxDepth\" />\n }\n }\n</hm-sidebar>\n","// Geometria do tour: o recorte iluminado (holofote) em volta do alvo e onde o balão cabe. Funções\n// puras, sem DOM — o componente mede e aplica.\n\nexport interface TourRect {\n readonly top: number;\n readonly left: number;\n readonly width: number;\n readonly height: number;\n}\n\nexport interface TourSize {\n readonly width: number;\n readonly height: number;\n}\n\nexport interface TourCardPosition {\n top: number;\n left: number;\n centered: boolean;\n}\n\n/** Folga do holofote em volta do alvo (cada lado). */\nexport const TOUR_SPOT_PADDING = 6;\n/** Distância entre o holofote e o balão. */\nexport const TOUR_CARD_GAP = 14;\n/** Distância mínima do balão às bordas da janela — a mesma do `max-width: calc(100vw - 24px)` do SCSS. */\nexport const TOUR_EDGE = 12;\n/** Largura do balão no SCSS (`.ob-card`), usada enquanto ele ainda não foi medido. */\nexport const TOUR_CARD_WIDTH = 332;\n/** Altura provável do balão antes da primeira medida (título + duas linhas + rodapé). */\nexport const TOUR_CARD_HEIGHT_GUESS = 190;\n\n/** Holofote: o retângulo do alvo com a mesma folga nos quatro lados. */\nexport function tourSpotlight(target: TourRect, padding = TOUR_SPOT_PADDING): TourRect {\n return {\n top: target.top - padding,\n left: target.left - padding,\n width: target.width + padding * 2,\n height: target.height + padding * 2,\n };\n}\n\n/** Largura que o balão de fato ocupa: a do CSS, limitada pela janela menos as margens. */\nexport function tourCardWidth(width: number, viewport: TourSize): number {\n return Math.max(0, Math.min(width, viewport.width - TOUR_EDGE * 2));\n}\n\n/** Prende `value` entre a margem e o maior início que ainda deixa `size` dentro de `room`. */\nfunction clampStart(value: number, size: number, room: number): number {\n return Math.max(TOUR_EDGE, Math.min(value, room - TOUR_EDGE - size));\n}\n\n/**\n * Onde o balão fica. Sem holofote: no meio da janela (`centered`). Com holofote, a primeira posição que\n * cabe: embaixo, em cima (ambas alinhadas à esquerda do holofote), à direita, à esquerda (ambas\n * alinhadas ao topo dele) e, se nada couber, no meio da janela por cima do alvo.\n */\nexport function placeTourCard(spot: TourRect | null, card: TourSize, viewport: TourSize): TourCardPosition {\n const width = tourCardWidth(card.width, viewport);\n const height = card.height;\n const centerTop = Math.max(TOUR_EDGE, (viewport.height - height) / 2);\n const centerLeft = Math.max(TOUR_EDGE, (viewport.width - width) / 2);\n if (!spot) return { top: centerTop, left: centerLeft, centered: true };\n\n const left = clampStart(spot.left, width, viewport.width);\n const top = clampStart(spot.top, height, viewport.height);\n\n const below = spot.top + spot.height + TOUR_CARD_GAP;\n if (below + height <= viewport.height - TOUR_EDGE) return { top: below, left, centered: false };\n\n const above = spot.top - TOUR_CARD_GAP - height;\n if (above >= TOUR_EDGE) return { top: above, left, centered: false };\n\n const right = spot.left + spot.width + TOUR_CARD_GAP;\n if (right + width <= viewport.width - TOUR_EDGE) return { top, left: right, centered: false };\n\n const leftSide = spot.left - TOUR_CARD_GAP - width;\n if (leftSide >= TOUR_EDGE) return { top, left: leftSide, centered: false };\n\n return {\n top: clampStart(centerTop, height, viewport.height),\n left: clampStart(centerLeft, width, viewport.width),\n centered: false,\n };\n}\n","import { CommonModule } from '@angular/common';\nimport { AfterRenderRef, ChangeDetectorRef, Component, ElementRef, HostListener, Injector, OnDestroy, OnInit, ViewChild, ChangeDetectionStrategy, afterNextRender, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ButtonComponent } from '@trismegisto/angular';\nimport { OnboardingService, OnboardingStep, findTourTarget } from './onboarding.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage, prefersReducedMotion } from '@trismegisto/primitives';\nimport {\n TOUR_CARD_HEIGHT_GUESS,\n TOUR_CARD_WIDTH,\n TourCardPosition,\n TourSize,\n placeTourCard,\n tourSpotlight,\n} from './onboarding-placement';\n\ninterface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/**\n * Desenho do tour guiado: escurece a tela, recorta um holofote sobre o alvo do passo e põe o balão\n * (título, texto, progresso e navegação) onde couber. Segue o `OnboardingService`; recalcula a cada\n * passo e quando a janela rola ou muda de tamanho.\n */\n@Component({\n selector: 'spine-onboarding-overlay',\n imports: [CommonModule, ButtonComponent],\n templateUrl: './onboarding-overlay.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './onboarding-overlay.component.scss',\n})\nexport class OnboardingOverlayComponent implements OnInit, OnDestroy {\n protected readonly text = inject(SPINE_MESSAGES).tour;\n protected readonly fmt = formatMessage;\n @ViewChild('cardEl') cardRef?: ElementRef<HTMLDivElement>;\n\n public step: OnboardingStep | null = null;\n public index = 0;\n public total = 0;\n\n /** holofote (null = passo centralizado, sem recorte). */\n public spot: Box | null = null;\n /** posição do balão. */\n public card: { top: number; left: number; centered: boolean } = { top: 0, left: 0, centered: true };\n\n private sub?: Subscription;\n private reposition?: AfterRenderRef;\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n\n constructor(private onboarding: OnboardingService) {}\n\n get isFirst(): boolean { return this.onboarding.isFirst; }\n get isLast(): boolean { return this.onboarding.isLast; }\n\n ngOnInit(): void {\n this.sub = this.onboarding.current$.subscribe((cur) => {\n // O passo chega de fora da detecção de mudanças (timer do serviço, clique no balão): marca a\n // view, senão um app sem zone.js não redesenha.\n this.cdr.markForCheck();\n if (!cur) { this.step = null; this.spot = null; return; }\n this.step = cur.step;\n this.index = cur.index;\n this.total = cur.total;\n this.layout();\n });\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n this.reposition?.destroy();\n }\n\n /** Holofote e balão do passo atual: primeiro com a altura estimada, depois com a medida real. */\n private layout(): void {\n const step = this.step;\n if (!step) return;\n const target = step.target ? findTourTarget(step.target) : null;\n if (target) this.bringIntoView(target);\n this.spot = target ? tourSpotlight(target.getBoundingClientRect()) : null;\n this.card = placeTourCard(this.spot, this.cardSize(TOUR_CARD_HEIGHT_GUESS), this.viewport());\n this.positionCard();\n }\n\n /**\n * Refina a posição depois que o balão foi desenhado (a altura depende do texto). Roda depois do\n * render e só marca a view se a posição mudou: sem NG0100 e sem precisar do zone.js.\n */\n private positionCard(): void {\n this.reposition?.destroy();\n this.reposition = afterNextRender(\n {\n read: () => {\n const height = this.cardRef?.nativeElement.offsetHeight ?? 0;\n if (!this.step || !height) return;\n const next = placeTourCard(this.spot, this.cardSize(height), this.viewport());\n if (!this.samePosition(next)) {\n this.card = next;\n this.cdr.markForCheck();\n }\n },\n },\n { injector: this.injector },\n );\n }\n\n /** Alvo fora da faixa visível: rola até o meio antes de medir (o `scroll` da janela refaz a conta). */\n private bringIntoView(target: HTMLElement): void {\n const rect = target.getBoundingClientRect();\n if (rect.top >= 0 && rect.bottom <= window.innerHeight) return;\n // Escolha do app (Configurações › Acessibilidade) ou, sem ela, o sistema.\n const calm = prefersReducedMotion();\n target.scrollIntoView({ block: 'center', inline: 'nearest', behavior: calm ? 'auto' : 'smooth' });\n }\n\n /** Largura que o CSS dá ao balão (medida quando já existe) e a altura informada. */\n private cardSize(height: number): TourSize {\n const measured = this.cardRef?.nativeElement.offsetWidth ?? 0;\n return { width: measured || TOUR_CARD_WIDTH, height };\n }\n\n private viewport(): TourSize {\n return { width: window.innerWidth, height: window.innerHeight };\n }\n\n private samePosition(next: TourCardPosition): boolean {\n return next.top === this.card.top && next.left === this.card.left && next.centered === this.card.centered;\n }\n\n @HostListener('window:resize')\n @HostListener('window:scroll')\n onViewportChange(): void {\n if (this.step) this.layout();\n }\n\n // ── ações ──\n next(): void { this.onboarding.next(); }\n prev(): void { this.onboarding.prev(); }\n skip(): void { this.onboarding.finish(); }\n}\n","<div class=\"ob-root\" *ngIf=\"step\">\n <!-- Holofote: recorte iluminado sobre o alvo (o escuro vem do box-shadow gigante). -->\n <div class=\"ob-spot\" *ngIf=\"spot\"\n [style.top.px]=\"spot.top\" [style.left.px]=\"spot.left\"\n [style.width.px]=\"spot.width\" [style.height.px]=\"spot.height\"></div>\n\n <!-- Passos centralizados (sem alvo): escurece a tela inteira. -->\n <div class=\"ob-dim\" *ngIf=\"!spot\"></div>\n\n <!-- Balão -->\n <div #cardEl class=\"ob-card\" [class.is-centered]=\"card.centered\"\n [style.top.px]=\"card.top\" [style.left.px]=\"card.left\">\n <div class=\"ob-card__head\">\n <h3 class=\"ob-card__title\">{{ step.title }}</h3>\n <span class=\"ob-progress\">{{ fmt(text.progress, { current: index + 1, total: total }) }}</span>\n </div>\n <p class=\"ob-card__desc\" [innerHTML]=\"step.description\"></p>\n\n <div class=\"ob-card__foot\">\n <hm-button class=\"ob-skip\" emphasis=\"minimal\" (clicked)=\"skip()\">{{ text.skip }}</hm-button>\n <div class=\"ob-card__foot-actions\">\n <hm-button *ngIf=\"!isFirst\" emphasis=\"medium\" (clicked)=\"prev()\">{{ text.back }}</hm-button>\n <hm-button (clicked)=\"next()\">\n {{ isLast ? text.finish : text.next }}\n </hm-button>\n </div>\n </div>\n </div>\n</div>\n","import { renderIconSvg } from '@trismegisto/icons';\nimport { motionPreferenceOf } from '@trismegisto/primitives';\nimport { SpineNewsIllustration } from '@trismegisto/spine';\n\n/** Literal colors and font for the slide artwork (an image cannot see the page's CSS variables). */\nexport interface NewsPalette {\n readonly background: string;\n readonly icon: string;\n readonly badge: string;\n readonly badgeBorder: string;\n readonly label: string;\n readonly font: string;\n}\n\nconst LIGHT_FALLBACK: NewsPalette = {\n background: '#f3f4f6',\n icon: '#2f6fdb',\n badge: '#ffffff',\n badgeBorder: '#d5d9e0',\n label: '#1e2329',\n font: 'sans-serif',\n};\n\nexport function readNewsPalette(doc: Document): NewsPalette {\n const style = doc.body ? doc.defaultView?.getComputedStyle(doc.body) : undefined;\n const pick = (prop: string, fallback: string) => (style?.getPropertyValue(prop) ?? '').trim() || fallback;\n return {\n background: pick('--hm-surface-raised', LIGHT_FALLBACK.background),\n icon: pick('--hm-accent', LIGHT_FALLBACK.icon),\n badge: pick('--hm-surface', LIGHT_FALLBACK.badge),\n badgeBorder: pick('--hm-divider', LIGHT_FALLBACK.badgeBorder),\n label: pick('--hm-text', LIGHT_FALLBACK.label),\n font: (style?.fontFamily ?? '').trim() || LIGHT_FALLBACK.font,\n };\n}\n\nconst XML_ENTITIES: Record<string, string> = { '&': '&', '<': '<', '>': '>', '\"': '"', \"'\": ''' };\n\nfunction xml(value: string): string {\n return value.replace(/[&<>\"']/g, (ch) => XML_ENTITIES[ch]);\n}\n\nconst WIDTH = 640;\nconst HEIGHT = 360;\nconst CX = WIDTH / 2;\nconst CY = 168;\n\n/** Places a catalog icon (24-unit grid, stroked with currentColor) as a nested, tinted <svg>. */\nfunction icon(shape: string, x: number, y: number, size: number, color: string): string {\n return renderIconSvg(shape).replace(\n /^<svg\\b/,\n `<svg x=\"${x}\" y=\"${y}\" width=\"${size}\" height=\"${size}\" color=\"${xml(color)}\"`,\n );\n}\n\n/** Four-point twinkle, the \"something new\" cue drawn around the hero icon. */\nfunction sparkle(x: number, y: number, r: number, color: string, opacity: number): string {\n const k = r * 0.28;\n const d = `M${x} ${y - r}Q${x + k} ${y - k} ${x + r} ${y}Q${x + k} ${y + k} ${x} ${y + r}Q${x - k} ${y + k} ${x - r} ${y}Q${x - k} ${y - k} ${x} ${y - r}Z`;\n return `<path d=\"${d}\" fill=\"${xml(color)}\" opacity=\"${opacity}\"/>`;\n}\n\nfunction round(n: number): number {\n return Math.round(n * 10) / 10;\n}\n\nexport function buildNewsIllustration(illustration: SpineNewsIllustration, palette: NewsPalette): string {\n const satellites = illustration.satellites ?? [];\n const orbiting = satellites.length > 0;\n const c = {\n bg: xml(palette.background),\n accent: xml(palette.icon),\n badge: xml(palette.badge),\n border: xml(palette.badgeBorder),\n label: xml(palette.label),\n };\n\n const heroRadius = orbiting ? 58 : 92;\n const heroIcon = orbiting ? 64 : 104;\n const parts: string[] = [`<rect width=\"${WIDTH}\" height=\"${HEIGHT}\" rx=\"28\" fill=\"${c.bg}\"/>`];\n\n if (orbiting) {\n parts.push(\n `<ellipse cx=\"${CX}\" cy=\"${CY}\" rx=\"214\" ry=\"104\" fill=\"none\" stroke=\"${c.accent}\" stroke-opacity=\".22\" stroke-width=\"2\" stroke-dasharray=\"2 10\" stroke-linecap=\"round\"/>`,\n );\n } else {\n parts.push(`<circle cx=\"${CX}\" cy=\"${CY + 8}\" r=\"${heroRadius + 34}\" fill=\"${c.accent}\" opacity=\".07\"/>`);\n }\n\n parts.push(\n `<circle cx=\"${CX}\" cy=\"${CY}\" r=\"${heroRadius}\" fill=\"${c.badge}\" stroke=\"${c.border}\" stroke-width=\"2\"/>`,\n `<circle cx=\"${CX}\" cy=\"${CY}\" r=\"${heroRadius - 10}\" fill=\"${c.accent}\" opacity=\".1\"/>`,\n icon(illustration.icon, CX - heroIcon / 2, CY - heroIcon / 2, heroIcon, palette.icon),\n sparkle(CX + heroRadius + 14, CY - heroRadius + 4, 13, palette.icon, 0.85),\n sparkle(CX - heroRadius - 8, CY + heroRadius - 18, 8, palette.icon, 0.5),\n );\n\n satellites.forEach((sat, i) => {\n // Start at the top-left so a lone satellite never sits on the hero's sparkle.\n const angle = -Math.PI * 0.75 + (i * 2 * Math.PI) / satellites.length;\n const x = round(CX + 214 * Math.cos(angle));\n const y = round(CY + 104 * Math.sin(angle));\n parts.push(\n `<g transform=\"translate(${x} ${y})\"><g class=\"sat\" style=\"animation-delay:${-(i * 1.3).toFixed(1)}s\">`,\n `<circle r=\"28\" fill=\"${c.badge}\" stroke=\"${c.border}\" stroke-width=\"2\"/>`,\n icon(sat.icon, -14, -14, 28, palette.icon),\n `<text y=\"48\" text-anchor=\"middle\" font-size=\"15\" fill=\"${c.label}\">${xml(sat.label)}</text>`,\n `</g></g>`,\n );\n });\n\n // A imagem é um data URI: o `data-motion` do app (Configurações › Acessibilidade) não chega lá dentro.\n // Com escolha no app, ela decide aqui, ao gerar; sem escolha, a media query da própria imagem segue o sistema.\n const motion = typeof document === 'undefined' ? 'system' : motionPreferenceOf(document.documentElement);\n const style = orbiting && motion !== 'reduce'\n ? '<style>.sat{animation:drift 5.6s ease-in-out infinite alternate}' +\n '@keyframes drift{from{transform:translateY(-5px)}to{transform:translateY(5px)}}' +\n (motion === 'full' ? '' : '@media (prefers-reduced-motion:reduce){.sat{animation:none}}') +\n '</style>'\n : '';\n\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${WIDTH} ${HEIGHT}\" width=\"${WIDTH}\" height=\"${HEIGHT}\" ` +\n `font-family=\"${xml(palette.font)}\">${style}${parts.join('')}</svg>`;\n return `data:image/svg+xml,${encodeURIComponent(svg)}`;\n}\n","import { ChangeDetectionStrategy, Component, DOCUMENT, computed, inject } from '@angular/core';\nimport { ButtonComponent, CarouselComponent, ModalComponent } from '@trismegisto/angular';\nimport { buildNewsIllustration, readNewsPalette } from './news-illustration';\nimport { SpineNewsService } from './news.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Painel de novidades: um diálogo com carrossel — \"olha o que mudou\", não tutorial (esse é o tour\n * de boas-vindas). Montado uma vez no layout; quem decide quando abre é o `SpineNewsService`.\n */\n@Component({\n selector: 'spine-news',\n imports: [ModalComponent, CarouselComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (news.isOpen()) {\n <hm-modal [heading]=\"text.heading\" size=\"medium\" [open]=\"true\" (closed)=\"news.close()\">\n <hm-carousel [label]=\"text.carousel\" [slides]=\"slides()\" />\n <ng-container footer>\n <hm-button (clicked)=\"news.close()\">{{ text.dismiss }}</hm-button>\n </ng-container>\n </hm-modal>\n }\n `,\n})\nexport class SpineNewsComponent {\n protected readonly news = inject(SpineNewsService);\n protected readonly text = inject(SPINE_MESSAGES).news;\n private readonly document = inject(DOCUMENT);\n\n /** O hm-carousel pede `image`/`alt` sempre presentes (vazios = sem imagem / decorativa). A\n * ilustração é desenhada na hora de abrir, com as cores do tema daquele momento. */\n protected readonly slides = computed(() => {\n if (!this.news.isOpen()) return [];\n const palette = readNewsPalette(this.document);\n return this.news.slides().map((s) => ({\n title: s.title,\n text: s.text,\n image: s.image ?? (s.illustration ? buildNewsIllustration(s.illustration, palette) : ''),\n // Ilustração é decorativa: o título e o texto do slide já dizem tudo.\n alt: s.image ? (s.alt ?? '') : '',\n }));\n });\n}\n","import { Component, OnDestroy, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { ButtonComponent, HermesShortcutService, ModalComponent, ShortcutListComponent } from '@trismegisto/angular';\nimport { ShortcutGroup, ShortcutService } from './shortcut.service';\nimport { OnboardingService } from '../onboarding/onboarding.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Painel de atalhos (cheatsheet). Abre com \"?\" (via `ShortcutService.help$`) e lista, com o\n * `hm-shortcut-list` da lib, os atalhos agrupados — com busca e o interruptor dos atalhos de tecla\n * única (WCAG 2.1.4; a escolha persiste no `SpinePreferencesService`). Também é o último passo do\n * onboarding.\n */\n@Component({\n selector: 'spine-shortcuts-cheatsheet',\n imports: [ModalComponent, ButtonComponent, ShortcutListComponent],\n templateUrl: './shortcuts-cheatsheet.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './shortcuts-cheatsheet.component.scss',\n})\nexport class ShortcutsCheatsheetComponent implements OnInit, OnDestroy {\n public open = false;\n protected readonly text = inject(SPINE_MESSAGES).shortcuts;\n private readonly shortcuts = inject(ShortcutService);\n private readonly onboarding = inject(OnboardingService);\n /** Atalhos do painel: registrados (favoritos numa linha só) + os que outra peça dispara. */\n protected readonly items = this.shortcuts.panelItems;\n /** Atalhos de tecla única ligados — sem eles o \"?\" da dica não funciona. */\n protected readonly characterKeys = inject(HermesShortcutService).characterKeys;\n /** Dica com a tecla no meio: o texto do catálogo partido em volta de `{key}`. */\n protected get hintParts(): string[] {\n return this.text.hint.split('{key}');\n }\n\n /** @deprecated O painel agora é o `hm-shortcut-list`; use `ShortcutService.panelItems()`. Sai numa próxima versão. */\n public get groups(): ShortcutGroup[] {\n return this.shortcuts.groups();\n }\n\n /** @deprecated As teclas são desenhadas pelo `hm-shortcut-list`. Sai numa próxima versão. */\n chips(keys: string): string[] {\n return keys.split('+').map((k) => k.trim()).filter(Boolean);\n }\n\n private sub?: Subscription;\n\n /** Reabre o tour de onboarding e fecha este painel. */\n replayTour(): void {\n this.open = false;\n this.onboarding.restart();\n }\n\n ngOnInit(): void {\n this.sub = this.shortcuts.help$.subscribe(() => (this.open = !this.open));\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"open = $event\" [heading]=\"text.heading\" size=\"large\">\n <!-- Com a tecla única desligada (WCAG 2.1.4) o \"?\" não abre o painel: a dica some junto. -->\n @if (characterKeys()) {\n <p class=\"sc-hint\">\n {{ hintParts[0] }}<kbd class=\"sc-chip\">?</kbd>{{ hintParts[1] }}\n </p>\n }\n\n <hm-shortcut-list searchable characterKeysToggle [registered]=\"false\" [items]=\"items()\" />\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" icon=\"play\" (clicked)=\"replayTour()\">{{ text.replayTour }}</hm-button>\n <hm-button (clicked)=\"open = false\">{{ text.dismiss }}</hm-button>\n </ng-container>\n</hm-modal>\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AUTH_CONFIG, AuthorizationService } from '@orfeu/angular/core';\n\n/** Um método de verificação em duas etapas, como o Argos devolve (nunca o segredo do TOTP). */\nexport interface AccountMethod {\n method_id: string;\n /** `totp`, `email`, `sms`... (nome fixo do método no Argos). */\n method_name: string;\n active: boolean;\n /** E-mail/telefone mascarados. */\n secret?: string;\n}\n\n/** `GET {api}/security`: métodos, política do realm, códigos de recuperação e estado da reautenticação. */\nexport interface AccountOverview {\n user: { username: string; name: string | null; email: string };\n policy: { required: boolean };\n methods: AccountMethod[];\n recovery_codes: { remaining: number };\n /** Id do \"método\" código de recuperação (reautenticação com um código). */\n recovery_method_id: string;\n reauthenticated: boolean;\n reauth_expires_in: number;\n /** Só na resposta do cadastro do primeiro método: os códigos de recuperação, exibidos uma vez. */\n recovery_codes_issued?: string[];\n}\n\n/** Uma sessão (um login num navegador) e os aplicativos que a usam. */\nexport interface AccountSession {\n id: string;\n /** A sessão deste login (a do token do app). */\n current: boolean;\n /** Outra sessão do mesmo navegador. */\n this_device: boolean;\n device: { browser?: string | null; os?: string | null; mobile: boolean; label: string };\n ip: string | null;\n created_at: string;\n last_seen_at: string;\n /** `false`: o login no Argos venceu, só o refresh de algum aplicativo segue vivo. */\n sso_active: boolean;\n clients: { client_id: string; name: string | null }[];\n}\n\n/** Uma tentativa de entrar na conta (`GET {api}/activity`): sucesso, falha ou cancelamento. */\nexport interface AccountActivityEntry {\n id: string;\n /** Data e hora (ISO). */\n at: string;\n result: 'success' | 'failure' | 'cancelled';\n /** `local`, `mfa`, `github`, `google`, `keycloak`, `entraid`. */\n method: string;\n /** Motivo da falha (`bad_password`, `mfa_failed`, `locked`…); `null` no sucesso. */\n reason: string | null;\n ip: string | null;\n device: { browser?: string | null; os?: string | null; mobile: boolean; label: string };\n /** Aplicativo em que a pessoa tentou entrar. */\n client: { client_id: string; name: string | null } | null;\n}\n\nexport interface AccountActivityPage {\n attempts: AccountActivityEntry[];\n total: number;\n limit: number;\n offset: number;\n /** Começo da janela (90 dias). */\n since: string;\n}\n\n/** Crachás da pessoa nesta aplicação e o padrão guardado no Argos (`GET {api}/badges`). */\nexport interface AccountBadges {\n client: { id: string; name: string | null };\n badges: { id: string; name: string }[];\n default_badge_id: string | null;\n active_badge_id: string | null;\n}\n\n/** Preferências guardadas na conta para esta aplicação (`GET/PUT {api}/preferences`). */\nexport interface AccountPreferences {\n preferences: Record<string, unknown>;\n updated_at: string | null;\n}\n\nexport type AccountReauth = { password: string } | { method_id: string; code: string };\n\n/**\n * Base da API da conta no Argos: `{authority}/api/realms/{realm}/account` — o mesmo `{authority}/api` que o\n * `@orfeu/angular` usa para o OIDC (a `authority` já traz o contexto do serviço, ex.: `https://host/argos`).\n * Sem `authority`/`realm` (ou com o `CHANGE_ME` de um environment ainda não preenchido) devolve `null`.\n */\nexport function argosAccountApi(authority: string | null | undefined, realm: string | null | undefined): string | null {\n const realmId = realm?.trim();\n if (authority == null || !realmId || authority.includes('CHANGE_ME') || realmId.includes('CHANGE_ME')) return null;\n return `${authority.trim().replace(/\\/+$/, '')}/api/realms/${encodeURIComponent(realmId)}/account`;\n}\n\n/**\n * Conta do usuário no Argos (verificação em duas etapas, códigos de recuperação, sessões) pela API da conta\n * com Bearer: o access token da sessão do app (`@orfeu/angular`), no header `Authorization` — o mesmo jeito\n * que o Orfeu fala com o Argos (ex.: `switchBadge`). O Argos reconhece a sessão SSO pelo `sid` do token; não\n * há cookie envolvido. Token vencido (`401 invalid_token`): renova uma vez (`silentRenew`) e repete.\n * `available` é falso sem `AUTH_CONFIG` utilizável.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineAccountSecurityService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n private readonly config = inject(AUTH_CONFIG, { optional: true });\n\n readonly baseUrl = argosAccountApi(this.config?.authority, this.config?.realmId);\n readonly available = !!this.baseUrl;\n\n overview(): Promise<AccountOverview> {\n return this.send('GET', '/security');\n }\n\n reauthenticate(proof: AccountReauth): Promise<{ reauthenticated: boolean; reauth_expires_in: number }> {\n return this.send('POST', '/reauth', proof);\n }\n\n requestReauthCode(methodId: string): Promise<{ method_id: string; expires_in: number }> {\n return this.send('POST', '/reauth/request', { method_id: methodId });\n }\n\n configure(methodId: string, email?: string): Promise<{ method_id: string; secret?: string; qrcode?: string; expires_in?: number }> {\n return this.send('POST', '/mfa/configure', email ? { method_id: methodId, email } : { method_id: methodId });\n }\n\n register(methodId: string, code: string): Promise<AccountOverview> {\n return this.send('POST', '/mfa/register', { method_id: methodId, code });\n }\n\n remove(methodId: string): Promise<AccountOverview> {\n return this.send('POST', '/mfa/remove', { method_id: methodId });\n }\n\n regenerateRecoveryCodes(): Promise<{ recovery_codes: string[]; remaining: number }> {\n return this.send('POST', '/recovery-codes', {});\n }\n\n sessions(): Promise<{ sessions: AccountSession[] }> {\n return this.send('GET', '/sessions');\n }\n\n endSession(sid: string): Promise<{ ended: boolean; current: boolean }> {\n return this.send('DELETE', `/sessions/${encodeURIComponent(sid)}`);\n }\n\n endOtherSessions(): Promise<{ ended: number }> {\n return this.send('DELETE', '/sessions/others');\n }\n\n /** Entradas e tentativas desta conta nos últimos 90 dias, da mais recente. `result` filtra só sucessos ou falhas. */\n activity(params: { limit?: number; offset?: number; result?: 'success' | 'failure' } = {}): Promise<AccountActivityPage> {\n const query = new URLSearchParams();\n if (params.limit) query.set('limit', String(params.limit));\n if (params.offset) query.set('offset', String(params.offset));\n if (params.result) query.set('result', params.result);\n const qs = query.toString();\n return this.send('GET', `/activity${qs ? `?${qs}` : ''}`);\n }\n\n badges(): Promise<AccountBadges> {\n return this.send('GET', '/badges');\n }\n\n /** Crachá com que o login entra nesta aplicação (`null` volta ao padrão: o de menor nível). */\n setDefaultBadge(badgeId: string | null): Promise<{ default_badge_id: string | null }> {\n return this.send('PUT', '/badges/default', { badge_id: badgeId });\n }\n\n preferences(): Promise<AccountPreferences> {\n return this.send('GET', '/preferences');\n }\n\n /** Substitui o documento de preferências desta aplicação na conta (até 16 KB). */\n savePreferences(preferences: Record<string, unknown>): Promise<AccountPreferences> {\n return this.send('PUT', '/preferences', { preferences });\n }\n\n private async send<T>(method: AccountMethodVerb, path: string, body?: object): Promise<T> {\n try {\n return await this.request<T>(method, path, body);\n } catch (err) {\n if (!(err instanceof HttpErrorResponse && err.status === 401 && err.error?.error === 'invalid_token')) throw err;\n await this.auth.silentRenew();\n return this.request<T>(method, path, body);\n }\n }\n\n private request<T>(method: AccountMethodVerb, path: string, body?: object): Promise<T> {\n if (!this.baseUrl) return Promise.reject(new Error('[hermes-spine] API da conta sem AUTH_CONFIG (authority/realmId).'));\n const headers = new HttpHeaders({ Authorization: `Bearer ${this.auth.getToken() ?? ''}` });\n return firstValueFrom(this.http.request<T>(method, `${this.baseUrl}${path}`, { body, headers }));\n }\n}\n\ntype AccountMethodVerb = 'GET' | 'POST' | 'PUT' | 'DELETE';\n\n/** Código de erro que o Argos devolveu (`{ error: 'invalid_code' }`), ou `''`. */\nexport function accountErrorCode(err: unknown): string {\n if (!(err instanceof HttpErrorResponse)) return '';\n const code = (err.error as { error?: unknown } | null)?.error;\n return typeof code === 'string' ? code : err.status === 0 ? 'network' : '';\n}\n","import { DestroyRef, Injectable, PLATFORM_ID, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { HERMES_THEME_CONFIG, HermesDensity, HermesSidebarService, HermesThemeMode, HermesThemeService } from '@trismegisto/angular';\nimport {\n DensityService, SPINE_CONFIG, SpineHourCyclePreference, SpinePreferencesService, SpineQuickAccessService, SpineStartPagePreference,\n ThemePresetService, ThemeService,\n} from '@trismegisto/spine';\nimport { HermesFont, HermesMotionPreference, Weekday } from '@trismegisto/primitives';\nimport { SpineAccountSecurityService } from '../settings/account-security.service';\n\n/** Versão do documento guardado na conta (muda só se o formato deixar de ser compatível). */\nconst DOC_VERSION = 1;\n/** Espera depois da última mudança antes de gravar. */\nexport const SPINE_PREFERENCES_SAVE_DELAY_MS = 1500;\n/** Favoritos guardados na conta (o servidor aceita até 16 KB no documento inteiro). */\nconst MAX_FAVORITES = 40;\n/** Quanto o login espera a conta responder antes de seguir com o que está no navegador. */\nconst READY_TIMEOUT_MS = 2000;\n\n/** Documento de preferências guardado no Argos (`PUT {api}/preferences`): chaves planas, todas opcionais. */\nexport interface SpineAccountPreferencesDoc {\n v: number;\n themeMode?: HermesThemeMode;\n family?: string;\n density?: HermesDensity;\n font?: string;\n sidebar?: 'auto' | 'fixed' | 'compact';\n language?: string;\n timeZone?: string;\n textScale?: number;\n motion?: HermesMotionPreference;\n hourCycle?: SpineHourCyclePreference;\n weekStart?: Weekday | null;\n characterKeys?: boolean;\n idleMinutes?: number;\n startPage?: SpineStartPagePreference;\n notices?: Record<string, boolean>;\n browserNotices?: boolean;\n favorites?: unknown[];\n}\n\n/** `local`: só no navegador (recurso desligado, sem API da conta, ou Argos sem o endpoint). */\nexport type SpineAccountPreferencesStatus = 'idle' | 'local' | 'loading' | 'saving' | 'synced' | 'error';\n\n/**\n * Preferências na conta (`SpineFeatures.accountPreferences`): espelha no Argos (`GET/PUT {api}/preferences`, por\n * usuário e aplicação) o que o painel de configurações guarda no navegador — tema, cor, densidade, fonte, menu\n * lateral, idioma, fuso, relógio, primeiro dia da semana, tamanho do texto, animações, atalhos de tecla única,\n * inatividade, tela inicial, tipos de aviso e favoritos. As telas Aparência, Região etc. não mudam: o\n * armazenamento local continua sendo a fonte de cada tela, e este serviço só sincroniza.\n *\n * - No início da sessão (`start()`, chamado pelo layout e pelo `/callback`), lê a conta e aplica o que estiver lá\n * (pelos mesmos `set*` das telas); favoritos são somados (os da conta primeiro). Conta vazia recebe o que está no\n * navegador.\n * - Depois, cada mudança é gravada na conta, agrupada (`SPINE_PREFERENCES_SAVE_DELAY_MS`).\n * - Sem a API da conta, com o recurso desligado ou com um Argos que não tem o endpoint (404/400), fica só no\n * navegador (`status() === 'local'`), sem erro na tela.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineAccountPreferencesService {\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly api = inject(SpineAccountSecurityService);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly quickAccess = inject(SpineQuickAccessService);\n private readonly hermesTheme = inject(HermesThemeService);\n private readonly themeConfig = inject(HERMES_THEME_CONFIG);\n private readonly theme = inject(ThemeService);\n private readonly density = inject(DensityService);\n private readonly presets = inject(ThemePresetService);\n private readonly sidebar = inject(HermesSidebarService);\n\n /** Recurso ligado e API da conta disponível. */\n readonly enabled = !!inject(SPINE_CONFIG, { optional: true })?.features?.accountPreferences && this.api.available;\n readonly status = signal<SpineAccountPreferencesStatus>(this.enabled ? 'idle' : 'local');\n /** Hora da última leitura/gravação bem-sucedida. */\n readonly syncedAt = signal<Date | null>(null);\n\n /** O documento que o navegador tem agora. */\n readonly snapshot = computed<SpineAccountPreferencesDoc>(() => {\n const p = this.preferences;\n return {\n v: DOC_VERSION,\n themeMode: this.hermesTheme.mode(),\n family: this.hermesTheme.family(),\n density: this.hermesTheme.density(),\n font: this.hermesTheme.font(),\n sidebar: this.sidebar.mode(),\n language: p.language(),\n timeZone: p.timeZone(),\n textScale: p.textScale(),\n motion: p.motion(),\n hourCycle: p.hourCycle(),\n weekStart: p.weekStart(),\n characterKeys: p.characterKeys(),\n idleMinutes: p.idleMinutes(),\n startPage: p.startPage(),\n notices: { ...p.noticeTypes() },\n browserNotices: p.browserNotices(),\n favorites: this.quickAccess.favorites().slice(0, MAX_FAVORITES).map((f) => ({ ...f })),\n };\n });\n\n private loaded = false;\n private lastSaved = '';\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readyPromise: Promise<void> | null = null;\n\n constructor() {\n if (!this.enabled || !this.browser) return;\n effect(() => {\n const json = stable(this.snapshot());\n if (!this.loaded || json === this.lastSaved) return;\n untracked(() => this.schedule());\n });\n inject(DestroyRef).onDestroy(() => this.clearTimer());\n }\n\n /**\n * Lê a conta e aplica (uma vez por sessão do app; chamadas seguintes devolvem a mesma promessa). Nunca rejeita.\n */\n start(): Promise<void> {\n if (!this.enabled || !this.browser) return Promise.resolve();\n this.readyPromise ??= this.load();\n return this.readyPromise;\n }\n\n /** Como `start()`, mas sem esperar mais que `timeoutMs` (o login não fica parado se o Argos demorar). */\n ready(timeoutMs = READY_TIMEOUT_MS): Promise<void> {\n return Promise.race([this.start(), new Promise<void>((resolve) => setTimeout(resolve, timeoutMs))]);\n }\n\n /** Grava agora o que estiver pendente (\"Sincronizar agora\"); relê a conta se ela ainda não respondeu. */\n async syncNow(): Promise<void> {\n if (!this.enabled) return;\n if (!this.loaded) {\n this.readyPromise = this.load();\n await this.readyPromise;\n return;\n }\n this.clearTimer();\n await this.save();\n }\n\n private async load(): Promise<void> {\n this.status.set('loading');\n try {\n const { preferences } = await this.api.preferences();\n const remote = isDoc(preferences) ? preferences : null;\n if (remote) this.apply(remote);\n this.loaded = true;\n this.syncedAt.set(new Date());\n if (remote) {\n this.lastSaved = stable(remote);\n // A conta pode ter menos do que o navegador (favoritos somados, chave nova): grava a diferença.\n if (stable(this.snapshot()) !== this.lastSaved) this.schedule();\n else this.status.set('synced');\n } else {\n await this.save();\n }\n } catch (err) {\n this.failed(err);\n }\n }\n\n /** Aplica o documento da conta pelos mesmos caminhos das telas (cada `set*` também grava no navegador). */\n private apply(doc: SpineAccountPreferencesDoc): void {\n const p = this.preferences;\n if (doc.themeMode && doc.themeMode !== this.hermesTheme.mode()) this.theme.setMode(doc.themeMode);\n if (doc.family && doc.family !== this.hermesTheme.family()) {\n const family = this.presets.families.find((f) => f.id === (this.themeConfig.aliases?.[doc.family!] ?? doc.family));\n if (family) this.presets.setPreset(family);\n }\n if (doc.density && doc.density !== this.hermesTheme.density()) this.density.setDensity(doc.density);\n if (doc.font && doc.font !== this.hermesTheme.font()) {\n const fonts = this.hermesTheme.fonts ?? [];\n if (!fonts.length || fonts.some((f) => f.id === doc.font)) this.hermesTheme.setFont(doc.font as HermesFont);\n }\n if (doc.sidebar && doc.sidebar !== this.sidebar.mode()) this.sidebar.setMode(doc.sidebar);\n if (typeof doc.language === 'string' && doc.language !== p.language()) p.setLanguage(doc.language);\n if (typeof doc.timeZone === 'string' && doc.timeZone !== p.timeZone()) p.setTimeZone(doc.timeZone);\n if (typeof doc.textScale === 'number' && doc.textScale !== p.textScale()) p.setTextScale(doc.textScale);\n if (doc.motion && doc.motion !== p.motion()) p.setMotion(doc.motion);\n if (doc.hourCycle !== undefined && doc.hourCycle !== p.hourCycle()) p.setHourCycle(doc.hourCycle);\n if (doc.weekStart !== undefined && doc.weekStart !== p.weekStart()) p.setWeekStart(doc.weekStart);\n if (typeof doc.characterKeys === 'boolean' && doc.characterKeys !== p.characterKeys()) p.setCharacterKeys(doc.characterKeys);\n if (typeof doc.idleMinutes === 'number' && doc.idleMinutes !== p.idleMinutes()) p.setIdleMinutes(doc.idleMinutes);\n if (typeof doc.startPage === 'string' && doc.startPage !== p.startPage()) p.setStartPage(doc.startPage);\n if (doc.notices && typeof doc.notices === 'object') p.setNoticeTypes({ ...p.noticeTypes(), ...doc.notices });\n // O aviso do navegador depende da permissão DESTE navegador: a conta só desliga, nunca liga sozinha.\n if (doc.browserNotices === false && p.browserNotices()) p.setBrowserNotices(false);\n if (Array.isArray(doc.favorites)) {\n const remote = doc.favorites;\n const ids = new Set(remote.map((f) => (f as { id?: unknown })?.id));\n const localOnly = this.quickAccess.favorites().filter((f) => !ids.has(f.id));\n this.quickAccess.setFavorites([...remote, ...localOnly]);\n }\n }\n\n private schedule(): void {\n this.clearTimer();\n this.status.set('saving');\n this.timer = setTimeout(() => void this.save(), SPINE_PREFERENCES_SAVE_DELAY_MS);\n }\n\n private async save(): Promise<void> {\n this.timer = null;\n const doc = this.snapshot();\n const json = stable(doc);\n this.status.set('saving');\n try {\n await this.api.savePreferences(doc as unknown as Record<string, unknown>);\n this.lastSaved = json;\n this.syncedAt.set(new Date());\n this.status.set('synced');\n } catch (err) {\n this.failed(err);\n }\n }\n\n private failed(err: unknown): void {\n // Argos sem o endpoint (versão anterior) ou sem client no token: fica só no navegador, sem insistir.\n if (err instanceof HttpErrorResponse && (err.status === 404 || err.status === 400 || err.status === 405)) {\n this.status.set('local');\n this.loaded = false;\n return;\n }\n this.status.set('error');\n }\n\n private clearTimer(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = null;\n }\n}\n\n/** JSON com as chaves dos objetos em ordem (a conta pode devolver outra ordem). */\nexport function stable(value: unknown): string {\n return JSON.stringify(value, (_key, v: unknown) =>\n v && typeof v === 'object' && !Array.isArray(v)\n ? Object.fromEntries(Object.entries(v as Record<string, unknown>).sort(([a], [b]) => a.localeCompare(b)))\n : v);\n}\n\nfunction isDoc(value: unknown): value is SpineAccountPreferencesDoc {\n return !!value && typeof value === 'object' && !Array.isArray(value) && typeof (value as { v?: unknown }).v === 'number';\n}\n","import { SPINE_IDLE_OPTIONS, SpineFeatures } from '@trismegisto/spine';\n\n/** Limites de \"Encerrar por inatividade\" já resolvidos a partir de `SpineFeatures.idleTimeout`. */\nexport interface SpineIdleLimits {\n enabled: boolean;\n /** Minutos mínimos (0 = sem mínimo). */\n min: number;\n /** Minutos máximos (0 = sem máximo; com máximo a opção \"Nunca\" some). */\n max: number;\n /** Opções oferecidas (0 = nunca), já filtradas pelos limites. */\n options: readonly number[];\n}\n\nconst positive = (value: unknown): number => {\n const n = Number(value);\n return Number.isFinite(n) && n > 0 ? Math.round(n) : 0;\n};\n\n/** Opções e limites de inatividade do app. Sem o recurso, `enabled` é falso e não há opções. */\nexport function idleLimits(features: SpineFeatures | undefined): SpineIdleLimits {\n const config = features?.idleTimeout;\n if (!config) return { enabled: false, min: 0, max: 0, options: [] };\n const min = typeof config === 'object' ? positive(config.min) : 0;\n let max = typeof config === 'object' ? positive(config.max) : 0;\n if (max && min && max < min) max = min;\n const options = SPINE_IDLE_OPTIONS.filter((m) => (m === 0 ? !max : m >= min && (!max || m <= max)));\n // Um limite fora das opções padrão (ex.: máximo de 10 min) entra como opção própria.\n const extra = [min, max].filter((m) => m > 0 && !options.includes(m));\n return { enabled: true, min, max, options: [...options, ...extra].sort((a, b) => a - b) };\n}\n\n/** Minutos que valem de fato: a escolha da pessoa dentro dos limites do app (0 = não encerra). */\nexport function effectiveIdleMinutes(chosen: number, limits: SpineIdleLimits): number {\n if (!limits.enabled) return 0;\n let minutes = chosen > 0 ? chosen : 0;\n if (limits.max && (minutes === 0 || minutes > limits.max)) minutes = limits.max;\n if (limits.min && minutes > 0 && minutes < limits.min) minutes = limits.min;\n return minutes;\n}\n","import { DestroyRef, Injectable, NgZone, PLATFORM_ID, computed, effect, inject, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { SPINE_CONFIG, SpinePreferencesService } from '@trismegisto/spine';\nimport { effectiveIdleMinutes, idleLimits } from '../features/spine-features';\nimport { SpineLogoutService } from '../logout/logout.service';\n\n/** Segundos de aviso antes de encerrar. */\nexport const SPINE_IDLE_WARNING_SECONDS = 60;\n/** Intervalo entre gravações da última atividade no `localStorage` (as outras abas leem de lá). */\nconst WRITE_EVERY_MS = 5_000;\nconst ACTIVITY_EVENTS = ['pointerdown', 'pointermove', 'keydown', 'wheel', 'touchstart', 'scroll'] as const;\n\n/**\n * Encerrar por inatividade (`SpineFeatures.idleTimeout`): conta o tempo sem uso (ponteiro, teclado, rolagem) em\n * TODAS as abas do app — a última atividade vai para o `localStorage` (`hermes_<clientId>_last_activity`) e cada aba\n * confere a mais recente —, abre o aviso com contagem regressiva `SPINE_IDLE_WARNING_SECONDS` antes do fim e, se\n * ninguém responder, sai pelo `SpineLogoutService` (o mesmo \"Sair\" do menu). Com o aviso aberto, só \"Continuar\n * conectado\" (ou atividade em outra aba) mantém a sessão: mexer o ponteiro sobre o aviso não conta.\n *\n * Os minutos vêm do `SpinePreferencesService.idleMinutes`, limitados pelo app (`effectiveIdleMinutes`). Ligado pelo\n * `LayoutComponent` (só existe com sessão); não faz nada fora do navegador.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineIdleService {\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly zone = inject(NgZone);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly logoutService = inject(SpineLogoutService);\n private readonly config = inject(SPINE_CONFIG, { optional: true });\n private readonly storageKey = `hermes_${this.config?.clientId || 'app'}_last_activity`;\n\n readonly limits = idleLimits(this.config?.features);\n /** Minutos que valem agora (0 = não encerra). */\n readonly minutes = computed(() => effectiveIdleMinutes(this.preferences.idleMinutes(), this.limits));\n /** Aviso aberto. */\n readonly warning = signal(false);\n /** Segundos que faltam, enquanto o aviso está aberto. */\n readonly secondsLeft = signal(SPINE_IDLE_WARNING_SECONDS);\n\n private lastActivity = Date.now();\n private lastWrite = 0;\n private timer: ReturnType<typeof setInterval> | null = null;\n private expiring = false;\n /** Ligado por `start()` (o layout, que só existe com sessão). */\n private readonly active = signal(false);\n private readonly onActivity = () => {\n if (this.warning()) return;\n this.touch();\n };\n\n constructor() {\n if (!this.browser) return;\n effect(() => {\n if (this.active() && this.minutes() > 0) this.run();\n else this.stop();\n });\n inject(DestroyRef).onDestroy(() => this.stop());\n }\n\n /** Liga a contagem (idempotente). Para sozinha quando a escolha vira \"Nunca\". */\n start(): void {\n this.active.set(true);\n }\n\n /** \"Continuar conectado\": fecha o aviso e recomeça a contagem. */\n stay(): void {\n this.warning.set(false);\n this.touch(true);\n }\n\n /** \"Sair agora\". */\n logoutNow(): void {\n void this.expire();\n }\n\n /** Conta uma atividade agora (e a grava para as outras abas no máximo a cada 5 s, ou já, com `force`). */\n touch(force = false): void {\n const now = Date.now();\n this.lastActivity = now;\n if (!force && now - this.lastWrite < WRITE_EVERY_MS) return;\n this.lastWrite = now;\n try { localStorage.setItem(this.storageKey, String(now)); } catch { /* storage indisponível */ }\n }\n\n /** Confere o tempo sem uso: abre o aviso, atualiza a contagem ou encerra. Exposto para os testes. */\n check(now = Date.now()): void {\n const minutes = this.minutes();\n if (!minutes || this.expiring) return;\n const idle = now - Math.max(this.lastActivity, this.storedActivity());\n const total = minutes * 60_000;\n const warnAt = Math.max(0, total - SPINE_IDLE_WARNING_SECONDS * 1000);\n if (idle >= total) {\n void this.expire();\n } else if (idle >= warnAt) {\n this.zone.run(() => {\n this.secondsLeft.set(Math.max(1, Math.ceil((total - idle) / 1000)));\n this.warning.set(true);\n });\n } else if (this.warning()) {\n // Atividade em outra aba: o aviso some sozinho.\n this.zone.run(() => this.warning.set(false));\n }\n }\n\n private storedActivity(): number {\n try {\n const value = Number(localStorage.getItem(this.storageKey));\n return Number.isFinite(value) ? value : 0;\n } catch {\n return 0;\n }\n }\n\n private run(): void {\n if (this.timer) return;\n this.touch(true);\n this.zone.runOutsideAngular(() => {\n for (const name of ACTIVITY_EVENTS) document.addEventListener(name, this.onActivity, { passive: true, capture: true });\n this.timer = setInterval(() => this.check(), 1000);\n });\n }\n\n private stop(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n if (this.browser) for (const name of ACTIVITY_EVENTS) document.removeEventListener(name, this.onActivity, { capture: true });\n this.warning.set(false);\n }\n\n private async expire(): Promise<void> {\n if (this.expiring) return;\n this.expiring = true;\n this.zone.run(() => this.warning.set(false));\n try {\n const ok = await this.logoutService.logout();\n // Saída recusada pelo Argos: a sessão continua (o aviso de falha já apareceu); recomeça a contagem.\n if (!ok) this.touch(true);\n } finally {\n this.expiring = false;\n }\n }\n}\n","import { Injectable, Injector, NgZone, PLATFORM_ID, computed, inject, isDevMode, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { HermesToastService } from '@trismegisto/angular';\nimport { SPINE_CONFIG, SPINE_MESSAGES, SpineNoticeType, SpinePreferencesService } from '@trismegisto/spine';\nimport type { AlertVariant } from '@trismegisto/primitives';\n\n/** Um aviso do app (`SpineNoticesService.notify`). */\nexport interface SpineNotice {\n title: string;\n /** Detalhe (segunda linha do aviso do navegador; no aviso da tela vai depois do título). */\n body?: string;\n /** Caminho interno (`/solicitacoes/42`) aberto pelo \"Abrir\" do aviso e pelo clique no aviso do navegador. */\n url?: string;\n /** Cor do aviso na tela. Padrão: `info`. */\n intent?: AlertVariant;\n}\n\n/** Permissão do navegador para avisos, ou `unsupported` (sem Notification API, ou fora do navegador). */\nexport type SpineNoticePermission = NotificationPermission | 'unsupported';\n\n/**\n * Avisos do app (`SpineFeatures.notices`): o app declara os tipos que emite (`{ id, label }`) e chama\n * `notify(tipo, aviso)` de onde já sabe do acontecimento (subscription, polling). Cada tipo pode ser desligado em\n * Configurações › Notificações; tipo desligado não aparece. O aviso ligado:\n *\n * - aparece na tela (`HermesToastService`, com \"Abrir\" quando tem `url`);\n * - com a aba em segundo plano, o aviso do navegador ligado e a permissão concedida, vira também um aviso do sistema\n * (Notification API); clicar nele traz a aba para a frente e abre a `url`.\n *\n * Tipo não declarado em `SpineFeatures.notices.types` aparece sempre (em desenvolvimento, com um aviso no console).\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineNoticesService {\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly zone = inject(NgZone);\n private readonly injector = inject(Injector);\n private readonly toast = inject(HermesToastService);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly messages = inject(SPINE_MESSAGES);\n private readonly config = inject(SPINE_CONFIG, { optional: true })?.features?.notices;\n private readonly warned = new Set<string>();\n\n /** Recurso ligado pelo app. */\n readonly enabled = !!this.config;\n /** Tipos declarados pelo app. */\n readonly types: readonly SpineNoticeType[] = this.config?.types ?? [];\n /** Permissão atual do navegador. */\n readonly permission = signal<SpineNoticePermission>(this.readPermission());\n /** Aviso do navegador valendo de fato: ligado nas configurações e permitido pelo navegador. */\n readonly browserActive = computed(() => this.preferences.browserNotices() && this.permission() === 'granted');\n\n /** O tipo está ligado (escolha da pessoa ou, sem escolha, o `defaultEnabled` dele). */\n isEnabled(typeId: string): boolean {\n const chosen = this.preferences.noticeTypes()[typeId];\n if (typeof chosen === 'boolean') return chosen;\n return this.types.find((t) => t.id === typeId)?.defaultEnabled ?? true;\n }\n\n setEnabled(typeId: string, enabled: boolean): void {\n this.preferences.setNoticeType(typeId, enabled);\n }\n\n /**\n * Liga o aviso do navegador: pede a permissão quando ainda não foi pedida. Devolve se ficou ligado (permissão\n * negada ou navegador sem suporte: continua desligado).\n */\n async enableBrowser(): Promise<boolean> {\n if (this.readPermission() === 'unsupported') {\n this.permission.set('unsupported');\n return false;\n }\n let permission = Notification.permission;\n if (permission === 'default') {\n try { permission = await Notification.requestPermission(); } catch { permission = 'denied'; }\n }\n this.permission.set(permission);\n const granted = permission === 'granted';\n this.preferences.setBrowserNotices(granted);\n return granted;\n }\n\n disableBrowser(): void {\n this.preferences.setBrowserNotices(false);\n }\n\n /** Relê a permissão (a pessoa pode ter mudado nas configurações do navegador). */\n refreshPermission(): void {\n this.permission.set(this.readPermission());\n }\n\n /** Mostra o aviso, se o tipo estiver ligado. Devolve se mostrou. */\n notify(typeId: string, notice: SpineNotice): boolean {\n if (this.types.length && !this.types.some((t) => t.id === typeId) && isDevMode() && !this.warned.has(typeId)) {\n this.warned.add(typeId);\n console.warn(`[hermes-spine] aviso de tipo não declarado em SpineFeatures.notices.types: ${typeId}`);\n }\n if (!this.isEnabled(typeId)) return false;\n const url = notice.url && notice.url.startsWith('/') && !notice.url.startsWith('//') ? notice.url : undefined;\n const message = notice.body ? `${notice.title} — ${notice.body}` : notice.title;\n this.toast.push(notice.intent ?? 'info', message, url\n ? { action: { label: this.messages.accountFeatures.noticeOpen, run: () => this.open(url) } }\n : undefined);\n if (this.browser && document.visibilityState === 'hidden' && this.preferences.browserNotices()) this.system(typeId, notice, url);\n return true;\n }\n\n private system(typeId: string, notice: SpineNotice, url: string | undefined): void {\n this.refreshPermission();\n if (this.permission() !== 'granted') return;\n try {\n const shown = new Notification(notice.title, { body: notice.body, tag: url ? `${typeId}:${url}` : typeId });\n shown.onclick = () => {\n window.focus();\n shown.close();\n if (url) this.open(url);\n };\n } catch {\n // Alguns navegadores (Chrome no Android) só aceitam aviso por service worker: fica só o da tela.\n }\n }\n\n private open(url: string): void {\n this.zone.run(() => void this.injector.get(Router).navigateByUrl(url));\n }\n\n private readPermission(): SpineNoticePermission {\n if (!this.browser || typeof Notification === 'undefined') return 'unsupported';\n return Notification.permission;\n }\n}\n","import { DestroyRef, Injectable, Injector, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { SPINE_CONFIG, SPINE_USER_STORAGE_KEYS, SpinePreferencesService, SpineQuickAccessService, SpineUserStorage } from '@trismegisto/spine';\n\n/** Rotas do shell que nunca viram \"última tela\". */\nconst IGNORED = /^\\/(callback|logoff|loggedout|login|no-permission|blocked)(\\/|$)/;\n\n/** Caminho interno seguro (`/x`, nunca `//host` nem `http:`). */\nexport function isInternalPath(url: unknown): url is string {\n return typeof url === 'string' && url.startsWith('/') && !url.startsWith('//') && !url.includes('\\\\');\n}\n\n/**\n * Tela inicial (`SpineFeatures.startPage`): para onde o app vai depois do login quando a pessoa não pediu uma URL\n * (`/callback` sem URL de retorno, ou com `/` ou `/home`) — o início do app, um favorito ou a última tela visitada.\n *\n * A última tela fica no `SpineUserStorage` (`lastPage`, por usuário) e só é gravada enquanto a escolha for\n * \"Última tela visitada\" (`track()`, ligado pelo `LayoutComponent`); ao contrário dos recentes, ela fica no logout.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineStartPageService {\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly storage = inject(SpineUserStorage);\n readonly enabled = !!inject(SPINE_CONFIG, { optional: true })?.features?.startPage;\n private tracking = false;\n\n /** Grava a URL de cada navegação enquanto a escolha for \"Última tela visitada\" (idempotente). */\n track(): void {\n if (!this.enabled || !this.browser || this.tracking) return;\n this.tracking = true;\n const router = this.injector.get(Router);\n const sub = router.events\n .pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd))\n .subscribe((e) => this.remember(e.urlAfterRedirects));\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n /** Guarda `url` como última tela (só com a escolha \"Última tela visitada\"). */\n remember(url: string): void {\n if (!this.enabled || this.preferences.startPage() !== 'last' || !isInternalPath(url) || IGNORED.test(url)) return;\n try { localStorage.setItem(this.storage.key(SPINE_USER_STORAGE_KEYS.lastPage), url); } catch { /* storage indisponível */ }\n }\n\n /** Destino da tela inicial escolhida, ou `null` (início do app, recurso desligado ou favorito que sumiu). */\n target(): string | null {\n if (!this.enabled || !this.browser) return null;\n const choice = this.preferences.startPage();\n if (choice === 'last') {\n let url: string | null = null;\n try { url = localStorage.getItem(this.storage.key(SPINE_USER_STORAGE_KEYS.lastPage)); } catch { url = null; }\n return isInternalPath(url) && !IGNORED.test(url) ? url : null;\n }\n if (choice.startsWith('fav:')) {\n const id = choice.slice(4);\n const favorite = this.injector.get(SpineQuickAccessService).favorites().find((f) => f.id === id);\n return favorite && isInternalPath(favorite.redirect) ? favorite.redirect : null;\n }\n return null;\n }\n\n /** `true` quando o login não pediu uma URL própria (aí a tela inicial manda). */\n static isDefaultReturn(returnUrl: string | null): boolean {\n return !returnUrl || returnUrl === '/' || returnUrl === '/home';\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { AlertComponent, ButtonComponent, IconComponent, SegmentedControlComponent, SegmentedOption, TagComponent, TagColor } from '@trismegisto/angular';\nimport { SPINE_MESSAGES, SpinePreferencesService } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { AccountActivityEntry, SpineAccountSecurityService, accountErrorCode } from './account-security.service';\n\n/** Itens por página. */\nconst PAGE = 10;\n\n/**\n * Atividade da conta (MFA › \"Atividade da conta\", `SpineFeatures.accountActivity`): as entradas e as tentativas que\n * falharam desta conta nos últimos 90 dias (`GET {api}/activity` do Argos) — quando, de onde (IP e navegador), em qual\n * aplicativo, por qual método e, na falha, o motivo. \"Só falhas\" filtra; \"Carregar mais\" traz a página seguinte.\n */\n@Component({\n selector: 'spine-account-activity',\n imports: [AlertComponent, ButtonComponent, IconComponent, SegmentedControlComponent, TagComponent],\n template: `\n <div class=\"sp-account__toolbar\">\n <hm-segmented-control size=\"small\" emphasis=\"action\" [label]=\"t.activityFilter\" [options]=\"filterOptions()\" [value]=\"filter()\" (valueChange)=\"setFilter($event)\" />\n </div>\n @if (loading() && !entries().length) {\n <p class=\"sp-account__note\" role=\"status\">{{ messages.accountSecurity.loading }}</p>\n } @else if (loadError()) {\n <hm-alert variant=\"error\">{{ errorText() }}</hm-alert>\n <div class=\"sp-account__actions\">\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"refresh\" (clicked)=\"reload()\">{{ messages.accountSecurity.retry }}</hm-button>\n </div>\n } @else {\n <div class=\"sp-account__list\">\n <ul class=\"sp-account__items\">\n @for (a of entries(); track a.id) {\n <li class=\"sp-account__item\">\n <span class=\"sp-account__icon\" [class.sp-account__icon--accent]=\"a.result === 'success'\"><hm-icon [shape]=\"a.device.mobile ? 'mobile' : 'computer'\" /></span>\n <span class=\"sp-account__item-main\">\n <span class=\"sp-account__item-title\">\n <strong>{{ a.device.label }}</strong>\n <hm-tag [name]=\"resultLabel(a)\" [color]=\"resultColor(a)\" />\n </span>\n <span class=\"sp-account__meta\">{{ detail(a) }}</span>\n <span class=\"sp-account__meta\">{{ method(a) }}@if (a.reason) { · {{ reason(a) }} }@if (a.client) { · {{ app(a) }} }</span>\n </span>\n </li>\n } @empty {\n <li class=\"sp-account__item sp-account__item--empty\">{{ t.activityEmpty }}</li>\n }\n </ul>\n @if (entries().length) {\n <div class=\"sp-account__list-footer\">\n <span class=\"sp-account__note\">{{ showing() }}</span>\n @if (entries().length < total()) {\n <hm-button size=\"small\" emphasis=\"medium\" [loading]=\"loading()\" (clicked)=\"more()\">{{ t.activityMore }}</hm-button>\n }\n </div>\n }\n </div>\n }\n `,\n styleUrl: './settings-blocks.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountActivityComponent {\n private readonly api = inject(SpineAccountSecurityService);\n protected readonly messages = inject(SPINE_MESSAGES);\n protected readonly t = this.messages.accountFeatures;\n private readonly attempts = this.messages.loginAttempts;\n private readonly preferences = inject(SpinePreferencesService);\n\n protected readonly filter = signal<'' | 'failure'>('');\n protected readonly entries = signal<AccountActivityEntry[]>([]);\n protected readonly total = signal(0);\n protected readonly loading = signal(true);\n protected readonly loadError = signal('');\n\n protected readonly filterOptions = computed<readonly SegmentedOption[]>(() => [\n { value: '', label: this.t.activityAll },\n { value: 'failure', label: this.t.activityFailures },\n ]);\n protected readonly showing = computed(() => formatMessage(this.t.activityShowing, { shown: this.entries().length, total: this.total() }));\n\n constructor() {\n if (this.api.available) void this.load(0);\n else this.loading.set(false);\n }\n\n protected setFilter(value: string): void {\n this.filter.set(value === 'failure' ? 'failure' : '');\n this.reload();\n }\n\n protected reload(): void {\n this.entries.set([]);\n void this.load(0);\n }\n\n protected more(): void {\n void this.load(this.entries().length);\n }\n\n private async load(offset: number): Promise<void> {\n this.loading.set(true);\n try {\n const page = await this.api.activity({ limit: PAGE, offset, result: this.filter() || undefined });\n const attempts = page?.attempts ?? [];\n this.entries.update((list) => (offset ? [...list, ...attempts] : attempts));\n this.total.set(page?.total ?? attempts.length);\n this.loadError.set('');\n } catch (err) {\n this.loadError.set(accountErrorCode(err) || 'generic');\n } finally {\n this.loading.set(false);\n }\n }\n\n protected errorText(): string {\n const errors = this.messages.accountSecurity.errors as Record<string, string>;\n const code = this.loadError();\n return code === 'generic' || !errors[code] ? this.t.activityLoadError : errors[code];\n }\n\n protected resultLabel(a: AccountActivityEntry): string {\n return this.attempts.results[a.result] ?? a.result;\n }\n\n protected resultColor(a: AccountActivityEntry): TagColor {\n return a.result === 'success' ? 'success' : a.result === 'failure' ? 'danger' : 'neutral';\n }\n\n protected method(a: AccountActivityEntry): string {\n return (this.attempts.methods as Record<string, string>)[a.method] ?? a.method;\n }\n\n protected reason(a: AccountActivityEntry): string {\n return (this.attempts.reasons as Record<string, string>)[a.reason ?? ''] ?? a.reason ?? '';\n }\n\n protected app(a: AccountActivityEntry): string {\n return formatMessage(this.t.activityApp, { app: a.client?.name || this.t.unknownApp });\n }\n\n protected detail(a: AccountActivityEntry): string {\n const date = new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() })\n .format(new Date(a.at));\n return formatMessage(this.t.activityDetail, { date, ip: a.ip || this.t.unknownIp });\n }\n}\n","import { Directive, Injectable, computed, inject, signal } from '@angular/core';\nimport { AccountMethod, AccountOverview, AccountReauth, SpineAccountSecurityService, accountErrorCode } from './account-security.service';\n\n/** O que a pessoa pediu: adicionar/trocar/remover um método ou gerar códigos de recuperação. */\nexport type AccountAction =\n | { kind: 'add' | 'replace' | 'remove'; method: AccountMethod }\n | { kind: 'codes' };\n\nexport type AccountStep = 'idle' | 'reauth' | 'confirm-remove' | 'enroll-totp' | 'enroll-email' | 'enroll-email-code' | 'codes';\n\n/** Avisos de sucesso (chaves de `SpineMessages.accountSecurity`). */\nexport type AccountNotice = 'methodAdded' | 'deviceReplaced' | 'methodRemoved' | 'codesRegenerated' | 'reauthCodeSent';\n\n/** Métodos que o painel trata (o Argos só tem fluxo para estes; o SMS aparece como indisponível). */\nconst SUPPORTED = ['totp', 'email', 'sms'];\nconst nameOf = (m: AccountMethod | null | undefined) => m?.method_name?.toLowerCase() ?? '';\nexport const isTotp = (m: AccountMethod | null | undefined) => nameOf(m) === 'totp';\nexport const isEmail = (m: AccountMethod | null | undefined) => nameOf(m) === 'email';\nexport const isSms = (m: AccountMethod | null | undefined) => nameOf(m) === 'sms';\n\n/**\n * Estado da seção \"MFA\" do painel de configurações: visão geral do Argos e o fluxo de uma\n * alteração (reautenticação → cadastro/remoção/códigos). Mesmo roteiro da tela \"Segurança da conta\" do\n * Argos: toda alteração pede antes a prova de identidade recente (senha ou um fator ativo, 5 minutos no\n * servidor); a recusa `reauthentication_required` no meio volta para a prova e a ação segue depois dela.\n *\n * Uma instância por abertura do painel (`spineAccountSecurity` no `hm-settings-section`): os códigos de\n * recuperação e o QR Code somem quando o painel fecha.\n */\n@Injectable()\nexport class SpineAccountSecurityState {\n private readonly api = inject(SpineAccountSecurityService);\n\n readonly available = this.api.available;\n readonly loading = signal(false);\n /** Código do erro ao carregar (`login_required`, `network`...); `''` = carregou. */\n readonly loadError = signal('');\n readonly overview = signal<AccountOverview | null>(null);\n\n readonly step = signal<AccountStep>('idle');\n readonly action = signal<AccountAction | null>(null);\n readonly busy = signal(false);\n /** Código do último erro de uma ação (`invalid_code`...). */\n readonly error = signal('');\n readonly notice = signal<AccountNotice | null>(null);\n\n /** Como provar a identidade: `password`, o id de um método ativo ou o id do código de recuperação. */\n readonly reauthMode = signal('password');\n readonly reauthCodeSent = signal(false);\n /** Até quando (epoch ms) a reautenticação vale, pelo que o servidor informou. */\n private reauthUntil = 0;\n\n readonly totpSetup = signal<{ secret: string; qrcode: string } | null>(null);\n readonly enrollEmail = signal('');\n /** Códigos de recuperação recém-gerados: só existem aqui, até a pessoa dizer que guardou. */\n readonly issuedCodes = signal<string[] | null>(null);\n\n readonly methods = computed(() => (this.overview()?.methods ?? []).filter((m) => SUPPORTED.includes(nameOf(m))));\n readonly activeMethods = computed(() => this.methods().filter((m) => m.active));\n readonly remainingCodes = computed(() => this.overview()?.recovery_codes.remaining ?? 0);\n readonly recoveryMethodId = computed(() => this.overview()?.recovery_method_id ?? '');\n /** Linha da última ação (métodos ou códigos): é ela que mostra o fluxo, o erro e o aviso. */\n readonly owner = signal<'methods' | 'codes'>('methods');\n\n constructor() {\n if (this.available) void this.load();\n }\n\n async load(): Promise<void> {\n this.loading.set(true);\n try {\n this.apply(await this.api.overview());\n this.loadError.set('');\n } catch (err) {\n this.loadError.set(accountErrorCode(err) || 'generic');\n } finally {\n this.loading.set(false);\n }\n }\n\n /** Com MFA obrigatório, o último método ativo não sai (o servidor também recusa: `mfa_last_method`). */\n canRemove(method: AccountMethod): boolean {\n return !(this.overview()?.policy.required && this.activeMethods().length <= 1 && method.active);\n }\n\n // ── Início de uma ação: reautentica se preciso, depois segue ───────────────\n start(action: AccountAction): void {\n this.error.set('');\n this.notice.set(null);\n this.issuedCodes.set(null);\n this.action.set(action);\n this.owner.set(action.kind === 'codes' ? 'codes' : 'methods');\n if (Date.now() < this.reauthUntil) void this.run(() => this.proceed());\n else this.openReauth();\n }\n\n cancel(): void {\n this.action.set(null);\n this.step.set('idle');\n this.error.set('');\n this.totpSetup.set(null);\n // Códigos de recuperação não ficam na memória da tela depois que o fluxo é abandonado.\n this.issuedCodes.set(null);\n }\n\n private openReauth(): void {\n this.reauthCodeSent.set(false);\n this.reauthMode.set('password');\n this.step.set('reauth');\n }\n\n chooseReauth(mode: string): void {\n this.error.set('');\n this.notice.set(null);\n this.reauthCodeSent.set(false);\n this.reauthMode.set(mode);\n }\n\n sendReauthCode(): Promise<void> {\n return this.run(async () => {\n await this.api.requestReauthCode(this.reauthMode());\n this.reauthCodeSent.set(true);\n this.notice.set('reauthCodeSent');\n });\n }\n\n confirmReauth(proof: AccountReauth): Promise<void> {\n return this.run(async () => {\n const response = await this.api.reauthenticate(proof);\n this.reauthUntil = Date.now() + (response?.reauth_expires_in ?? 0) * 1000;\n this.notice.set(null);\n await this.proceed();\n });\n }\n\n // ── Depois da reautenticação (sempre de dentro de run()) ───────────────────\n private async proceed(): Promise<void> {\n const action = this.action();\n if (!action) return;\n if (action.kind === 'remove') {\n this.step.set('confirm-remove');\n return;\n }\n if (action.kind === 'codes') {\n const result = await this.api.regenerateRecoveryCodes();\n this.issuedCodes.set(result.recovery_codes);\n this.step.set('codes');\n await this.refresh();\n return;\n }\n if (isTotp(action.method)) {\n const setup = await this.api.configure(action.method.method_id);\n this.totpSetup.set({ secret: setup.secret ?? '', qrcode: setup.qrcode ?? '' });\n this.step.set('enroll-totp');\n return;\n }\n this.step.set('enroll-email');\n }\n\n sendEnrollEmail(email: string): Promise<void> {\n const action = this.action();\n if (!action || action.kind === 'codes') return Promise.resolve();\n return this.run(async () => {\n await this.api.configure(action.method.method_id, email);\n this.enrollEmail.set(email);\n this.step.set('enroll-email-code');\n });\n }\n\n confirmEnroll(code: string): Promise<void> {\n const action = this.action();\n if (!action || action.kind === 'codes' || action.kind === 'remove' || !/^\\d{6}$/.test(code)) return Promise.resolve();\n return this.run(async () => {\n const overview = await this.api.register(action.method.method_id, code);\n this.apply(overview);\n this.totpSetup.set(null);\n if (overview.recovery_codes_issued?.length) {\n // Primeiro método: os códigos aparecem uma vez, na linha deles.\n this.action.set({ kind: 'codes' });\n this.owner.set('codes');\n this.issuedCodes.set(overview.recovery_codes_issued);\n this.step.set('codes');\n return;\n }\n this.finish(action.kind === 'replace' ? 'deviceReplaced' : 'methodAdded');\n });\n }\n\n confirmRemove(): Promise<void> {\n const action = this.action();\n if (!action || action.kind !== 'remove') return Promise.resolve();\n return this.run(async () => {\n this.apply(await this.api.remove(action.method.method_id));\n this.finish('methodRemoved');\n });\n }\n\n codesSaved(): void {\n this.issuedCodes.set(null);\n this.finish('codesRegenerated');\n }\n\n private finish(notice: AccountNotice): void {\n this.action.set(null);\n this.step.set('idle');\n this.notice.set(notice);\n }\n\n private apply(overview: AccountOverview): void {\n this.overview.set(overview);\n if (overview.reauthenticated) this.reauthUntil = Date.now() + overview.reauth_expires_in * 1000;\n }\n\n private async refresh(): Promise<void> {\n try {\n this.apply(await this.api.overview());\n } catch {\n // A ação já foi feita; a contagem volta certa na próxima abertura do painel.\n }\n }\n\n /** Executa uma chamada com o estado de ocupado e o erro na tela. A reautenticação vencida no meio volta\n * para a prova de identidade (e a ação continua depois dela). */\n private async run(fn: () => Promise<void>): Promise<void> {\n if (this.busy()) return;\n this.busy.set(true);\n this.error.set('');\n try {\n await fn();\n } catch (err) {\n const code = accountErrorCode(err) || 'generic';\n if (code === 'reauthentication_required') {\n this.reauthUntil = 0;\n this.openReauth();\n }\n this.error.set(code);\n } finally {\n this.busy.set(false);\n }\n }\n}\n\n/**\n * Escopo do estado da conta: no `hm-settings-section` da seção \"MFA\", para as linhas da seção\n * (métodos e códigos de recuperação) dividirem o mesmo estado e ele morrer junto com o painel.\n */\n@Directive({\n selector: '[spineAccountSecurity]',\n providers: [SpineAccountSecurityState],\n})\nexport class SpineAccountSecurityScopeDirective {}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ButtonComponent, CodeInputComponent, IconComponent, InputComponent, RadioComponent, RadioOption } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineAccountSecurityState, isEmail, isSms, isTotp } from './account-security.state';\n\nlet sequence = 0;\n\n/**\n * Prova de identidade antes de uma alteração na conta (senha, código do autenticador, código enviado ao\n * e-mail cadastrado ou código de recuperação). Vale 5 minutos no Argos, presa à sessão do login; depois\n * dela a ação pedida continua sozinha (`SpineAccountSecurityState.confirmReauth`).\n */\n@Component({\n selector: 'spine-account-reauth',\n imports: [ReactiveFormsModule, ButtonComponent, CodeInputComponent, IconComponent, InputComponent, RadioComponent],\n template: `\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"titleId\" [attr.aria-describedby]=\"hintId\">\n <div class=\"sp-account__panel-head\">\n <hm-icon shape=\"shield-check\" />\n <div class=\"sp-account__panel-text\">\n <h4 class=\"sp-account__title\" [id]=\"titleId\">{{ t.reauthTitle }}</h4>\n <p class=\"sp-account__note\" [id]=\"hintId\">{{ t.reauthHint }}</p>\n </div>\n </div>\n\n @if (choices().length > 1) {\n <hm-radio layout=\"inline\" [label]=\"t.reauthHow\" [options]=\"choices()\" [value]=\"state.reauthMode()\" (valueChange)=\"choose($event)\" />\n }\n\n @switch (kind()) {\n @case ('password') {\n <form class=\"sp-account__form\" (submit)=\"$event.preventDefault(); submitPassword()\">\n <hm-input type=\"password\" autocomplete=\"current-password\" [label]=\"t.currentPassword\" [formControl]=\"password\" [messages]=\"{ required: t.passwordRequired }\" />\n <div class=\"sp-account__actions\">\n <hm-button type=\"submit\" emphasis=\"high\" [loading]=\"state.busy()\">{{ t.confirm }}</hm-button>\n <hm-button emphasis=\"medium\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </form>\n }\n @case ('recovery') {\n <form class=\"sp-account__form\" (submit)=\"$event.preventDefault(); submitRecovery()\">\n <hm-input autocomplete=\"off\" [label]=\"t.recoveryCode\" [placeholder]=\"t.recoveryCodePlaceholder\" [formControl]=\"recoveryCode\"\n [messages]=\"{ required: t.recoveryCodeRequired, minlength: t.recoveryCodeLength }\" />\n <div class=\"sp-account__actions\">\n <hm-button type=\"submit\" emphasis=\"high\" [loading]=\"state.busy()\">{{ t.confirm }}</hm-button>\n <hm-button emphasis=\"medium\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </form>\n }\n @case ('email-request') {\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"high\" icon=\"mail\" [loading]=\"state.busy()\" (clicked)=\"state.sendReauthCode()\">{{ t.sendEmailCode }}</hm-button>\n <hm-button emphasis=\"medium\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n }\n @default {\n <div class=\"sp-account__code\" role=\"group\" [attr.aria-labelledby]=\"codeLabelId\">\n <span class=\"sp-account__label\" [id]=\"codeLabelId\">{{ t.sixDigitCode }}</span>\n <hm-code-input (completed)=\"submitCode($event)\" />\n </div>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"medium\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n }\n }\n </section>\n `,\n styleUrl: './settings-blocks.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountReauthComponent {\n protected readonly state = inject(SpineAccountSecurityState);\n protected readonly t = inject(SPINE_MESSAGES).accountSecurity;\n protected readonly titleId = `sp-account-reauth-${++sequence}`;\n protected readonly codeLabelId = `${this.titleId}-code`;\n protected readonly hintId = `${this.titleId}-hint`;\n\n protected readonly password = new FormControl('', { nonNullable: true, validators: [Validators.required] });\n protected readonly recoveryCode = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.minLength(10)] });\n\n /** Senha, os métodos ativos que servem de prova (o SMS não tem envio) e, com códigos restantes, um código de recuperação. */\n protected readonly choices = computed<RadioOption[]>(() => {\n const options: RadioOption[] = [{ value: 'password', label: this.t.reauthPassword }];\n for (const m of this.state.activeMethods()) {\n if (isSms(m)) continue;\n options.push({ value: m.method_id, label: isTotp(m) ? this.t.methodTotp : isEmail(m) ? this.t.methodEmail : m.method_name });\n }\n if (this.state.activeMethods().length && this.state.remainingCodes() > 0) {\n options.push({ value: this.state.recoveryMethodId(), label: this.t.reauthRecoveryCode });\n }\n return options;\n });\n\n protected readonly kind = computed<'password' | 'recovery' | 'email-request' | 'code'>(() => {\n const mode = this.state.reauthMode();\n if (mode === 'password') return 'password';\n if (mode === this.state.recoveryMethodId()) return 'recovery';\n const method = this.state.activeMethods().find((m) => m.method_id === mode);\n return isEmail(method) && !this.state.reauthCodeSent() ? 'email-request' : 'code';\n });\n\n protected choose(mode: string | null): void {\n if (mode) this.state.chooseReauth(mode);\n }\n\n protected submitPassword(): void {\n this.password.markAsTouched();\n if (this.password.invalid) return;\n void this.state.confirmReauth({ password: this.password.value });\n }\n\n protected submitRecovery(): void {\n this.recoveryCode.markAsTouched();\n if (this.recoveryCode.invalid) return;\n void this.state.confirmReauth({ method_id: this.state.reauthMode(), code: this.recoveryCode.value.trim() });\n }\n\n protected submitCode(code: string): void {\n void this.state.confirmReauth({ method_id: this.state.reauthMode(), code });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { AlertComponent, ButtonComponent, CodeInputComponent, IconComponent, InputComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { AccountMethod } from './account-security.service';\nimport { SpineAccountSecurityState, isEmail, isSms, isTotp } from './account-security.state';\nimport { AccountReauthComponent } from './account-reauth.component';\n\nlet sequence = 0;\n\n/**\n * Verificação em duas etapas da conta no Argos, dentro do painel de configurações: os métodos (ativo ou não\n * cadastrado; o SMS, sem fluxo no Argos, só aparece se já estiver ativo) e as ações — adicionar (TOTP com QR Code\n * e confirmação pelo código; e-mail com código no endereço informado), trocar o aparelho do autenticador e remover. Cada ação passa antes pela\n * reautenticação (`spine-account-reauth`).\n */\n@Component({\n selector: 'spine-account-mfa',\n imports: [ReactiveFormsModule, AlertComponent, ButtonComponent, CodeInputComponent, IconComponent, InputComponent, AccountReauthComponent],\n templateUrl: './account-mfa.component.html',\n styleUrl: './settings-blocks.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountMfaComponent {\n protected readonly state = inject(SpineAccountSecurityState);\n protected readonly t = inject(SPINE_MESSAGES).accountSecurity;\n protected readonly fmt = formatMessage;\n protected readonly isTotp = isTotp;\n protected readonly isSms = isSms;\n protected readonly ids = `sp-account-mfa-${++sequence}`;\n\n protected readonly email = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.email] });\n\n /** Métodos da lista: o SMS não cadastrado fica de fora (não há como cadastrar daqui). */\n protected readonly shown = computed(() => this.state.methods().filter((m) => !isSms(m) || m.active));\n\n protected label(method: AccountMethod | null | undefined): string {\n if (!method) return '';\n if (isTotp(method)) return this.t.methodTotp;\n if (isEmail(method)) return this.t.methodEmail;\n if (isSms(method)) return this.t.methodSms;\n return method.method_name;\n }\n\n protected icon(method: AccountMethod): string {\n return isTotp(method) ? 'authenticator' : isEmail(method) ? 'mail' : 'sms';\n }\n\n protected status(method: AccountMethod): string {\n if (!method.active) return this.t.notRegistered;\n return method.secret ? formatMessage(this.t.activeWithDetail, { detail: method.secret }) : this.t.active;\n }\n\n /** Método da ação em andamento (para o título \"Remover ...?\"). */\n protected actionMethod(): AccountMethod | null {\n const action = this.state.action();\n return action && action.kind !== 'codes' ? action.method : null;\n }\n\n protected errorText(code: string): string {\n return (this.t.errors as Record<string, string>)[code] ?? this.t.errors.generic;\n }\n\n protected startAdd(method: AccountMethod): void {\n this.email.reset('');\n this.state.start({ kind: 'add', method });\n }\n\n protected sendEmail(): void {\n this.email.markAsTouched();\n if (this.email.invalid) return;\n void this.state.sendEnrollEmail(this.email.value.trim());\n }\n}\n","@if (state.loading() && !state.overview()) {\n <p class=\"sp-account__note\" role=\"status\">{{ t.loading }}</p>\n} @else if (state.loadError()) {\n <hm-alert variant=\"error\">{{ errorText(state.loadError()) }}</hm-alert>\n @if (state.loadError() !== 'login_required' && state.loadError() !== 'invalid_token') {\n <div class=\"sp-account__actions\">\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"refresh\" (clicked)=\"state.load()\">{{ t.retry }}</hm-button>\n </div>\n }\n} @else if (state.overview(); as data) {\n @if (state.owner() === 'methods') {\n @if (state.notice(); as notice) {\n <hm-alert variant=\"success\">{{ t.notices[notice] }}</hm-alert>\n }\n @if (state.error(); as error) {\n <hm-alert variant=\"error\">{{ errorText(error) }}</hm-alert>\n }\n }\n\n @if (state.owner() === 'methods' && state.step() !== 'idle') {\n @switch (state.step()) {\n @case ('reauth') {\n <spine-account-reauth />\n }\n\n @case ('confirm-remove') {\n <section class=\"sp-account__panel sp-account__panel--danger\" [attr.aria-labelledby]=\"ids + '-remove'\">\n <div class=\"sp-account__panel-head\">\n <hm-icon shape=\"trash\" />\n <div class=\"sp-account__panel-text\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-remove'\">{{ fmt(t.removeTitle, { method: label(actionMethod()) }) }}</h4>\n <p class=\"sp-account__note\">\n {{ t.removeHint }}\n @if (state.activeMethods().length <= 1) { {{ t.removeLastHint }} }\n </p>\n </div>\n </div>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"high\" intent=\"danger\" [loading]=\"state.busy()\" (clicked)=\"state.confirmRemove()\">{{ t.remove }}</hm-button>\n <hm-button emphasis=\"medium\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </section>\n }\n\n @case ('enroll-totp') {\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"ids + '-totp'\">\n <div class=\"sp-account__panel-head\">\n <hm-icon shape=\"authenticator\" />\n <div class=\"sp-account__panel-text\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-totp'\">{{ t.totpTitle }}</h4>\n @if (state.totpSetup(); as setup) {\n <p class=\"sp-account__note\">{{ t.manualKey }} <code class=\"sp-account__secret\">{{ setup.secret }}</code></p>\n }\n </div>\n </div>\n @if (state.totpSetup()?.qrcode; as qrcode) {\n <div class=\"sp-account__qr\"><img [src]=\"qrcode\" [alt]=\"t.qrAlt\" /></div>\n }\n <div class=\"sp-account__code\" role=\"group\" [attr.aria-labelledby]=\"ids + '-totp-code'\">\n <span class=\"sp-account__label\" [id]=\"ids + '-totp-code'\">{{ t.appCode }}</span>\n <hm-code-input (completed)=\"state.confirmEnroll($event)\" />\n </div>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"medium\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </section>\n }\n\n @case ('enroll-email') {\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"ids + '-email'\">\n <div class=\"sp-account__panel-head\">\n <hm-icon shape=\"mail\" />\n <div class=\"sp-account__panel-text\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-email'\">{{ t.emailTitle }}</h4>\n </div>\n </div>\n <form class=\"sp-account__form\" (submit)=\"$event.preventDefault(); sendEmail()\">\n <hm-input type=\"email\" autocomplete=\"email\" [label]=\"t.email\" [placeholder]=\"t.emailPlaceholder\" [formControl]=\"email\"\n [messages]=\"{ required: t.emailRequired, email: t.emailInvalid }\" />\n <div class=\"sp-account__actions\">\n <hm-button type=\"submit\" emphasis=\"high\" icon=\"mail\" [loading]=\"state.busy()\">{{ t.sendCode }}</hm-button>\n <hm-button emphasis=\"medium\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </form>\n </section>\n }\n\n @case ('enroll-email-code') {\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"ids + '-email-code'\">\n <div class=\"sp-account__panel-head\">\n <hm-icon shape=\"mail\" />\n <div class=\"sp-account__panel-text\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-email-code'\">{{ t.emailCodeTitle }}</h4>\n <p class=\"sp-account__note\" [id]=\"ids + '-email-code-hint'\">{{ fmt(t.emailCodeHint, { email: state.enrollEmail() }) }}</p>\n </div>\n </div>\n <div class=\"sp-account__code\" role=\"group\" [attr.aria-labelledby]=\"ids + '-email-code-label'\" [attr.aria-describedby]=\"ids + '-email-code-hint'\">\n <span class=\"sp-account__label\" [id]=\"ids + '-email-code-label'\">{{ t.sixDigitCode }}</span>\n <hm-code-input (completed)=\"state.confirmEnroll($event)\" />\n </div>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"medium\" [disabled]=\"state.busy()\" (clicked)=\"state.cancel()\">{{ t.cancel }}</hm-button>\n </div>\n </section>\n }\n }\n } @else {\n <div class=\"sp-account__list\">\n <ul class=\"sp-account__items\">\n @for (m of shown(); track m.method_id) {\n <li class=\"sp-account__item\">\n <span class=\"sp-account__icon\" [class.sp-account__icon--accent]=\"m.active\"><hm-icon [shape]=\"icon(m)\" /></span>\n <span class=\"sp-account__item-main\">\n <span class=\"sp-account__item-title\"><strong>{{ label(m) }}</strong></span>\n <span class=\"sp-account__meta\">{{ status(m) }}</span>\n </span>\n @if (!isSms(m)) {\n <span class=\"sp-account__item-actions\">\n @if (!m.active) {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"plus\" [disabled]=\"state.busy() || state.step() !== 'idle'\" (clicked)=\"startAdd(m)\">{{ t.add }}</hm-button>\n } @else {\n @if (isTotp(m)) {\n <hm-button size=\"small\" emphasis=\"medium\" [disabled]=\"state.busy() || state.step() !== 'idle'\" (clicked)=\"state.start({ kind: 'replace', method: m })\">{{ t.replaceDevice }}</hm-button>\n }\n <hm-button size=\"small\" emphasis=\"medium\" intent=\"danger\" [disabled]=\"state.busy() || state.step() !== 'idle' || !state.canRemove(m)\" (clicked)=\"state.start({ kind: 'remove', method: m })\">{{ t.remove }}</hm-button>\n }\n </span>\n }\n </li>\n }\n </ul>\n @if (data.policy.required) {\n <div class=\"sp-account__list-footer\">\n <span class=\"sp-account__note\">{{ t.requiredHint }}</span>\n </div>\n }\n </div>\n }\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { SPINE_ADMIN_API } from '@trismegisto/spine';\nimport { urlPath } from '@trismegisto/primitives';\n\n/** Um token de aplicação do usuário, como o argos-admin devolve (nunca o valor, só o prefixo). */\nexport interface AppToken {\n id: string;\n name: string;\n description: string | null;\n prefix: string;\n badge_id: string;\n badge_name: string;\n expires_at: string;\n created_at: string;\n last_used_at: string | null;\n expired: boolean;\n}\n\nexport interface AppTokenList {\n tokens: AppToken[];\n max_active: number;\n max_days: number;\n}\n\n/** A aplicação logada e os níveis de acesso que o usuário pode escolher nela ao criar um token. */\nexport interface AppTokenOptions {\n client: { id: string; name: string | null };\n badges: { id: string; name: string }[];\n max_days: number;\n}\n\nexport interface CreatedAppToken {\n id: string;\n /** Valor bruto — só existe nesta resposta. */\n token: string;\n expires_at: string;\n}\n\n/**\n * Tokens de aplicação pessoais (`x-app-token`) do usuário logado — `argos-admin /me/app-tokens`.\n * Sempre da aplicação LOGADA: o servidor tira o client do próprio access-token da sessão, então\n * aqui não existe escolha de aplicação.\n * Autentica com o access-token da sessão (o servidor recusa um app-token aqui: token não cria\n * token). `available` é falso quando o app não tem a URL do argos-admin (`SPINE_ADMIN_API`).\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineAppTokensService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n private readonly adminApi = inject(SPINE_ADMIN_API, { optional: true });\n\n readonly available = !!this.adminApi;\n /** Sobe a cada token criado por aqui (o \"Conectar um agente de IA\" cria um; a lista de tokens relê). */\n readonly changes = signal(0);\n\n private get baseUrl(): string {\n return `${this.adminApi}/me/app-tokens`;\n }\n\n private get headers(): HttpHeaders {\n return new HttpHeaders({ 'x-access-token': this.auth.getToken() ?? '' });\n }\n\n list(): Promise<AppTokenList> {\n return firstValueFrom(this.http.get<AppTokenList>(this.baseUrl, { headers: this.headers }));\n }\n\n options(): Promise<AppTokenOptions> {\n return firstValueFrom(this.http.get<AppTokenOptions>(`${this.baseUrl}/options`, { headers: this.headers }));\n }\n\n async create(body: { badge_id: string; name: string; validity_days: number }): Promise<CreatedAppToken> {\n const created = await firstValueFrom(this.http.post<CreatedAppToken>(this.baseUrl, body, { headers: this.headers }));\n this.changes.update((n) => n + 1);\n return created;\n }\n\n revoke(id: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(`${this.baseUrl}${urlPath`/${id}`}`, { headers: this.headers }));\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport {\n ButtonComponent, CheckboxComponent, CodeViewerComponent, HermesToastService, IconComponent, SegmentedControlComponent, SegmentedOption,\n} from '@trismegisto/angular';\nimport { SPINE_CONFIG, SPINE_MESSAGES, SpineMcpServer, SpinePreferencesService } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { SpineAppTokensService } from './app-tokens.service';\n\n/** Monta o `.mcp.json` do Claude Code: uma entrada por servidor, todas com o mesmo token. Com `write`, cada servidor\n * que tem `writeScopes` pede esses escopos; os demais (e todos sem `write`) vão com `readScopes`, ou sem o header\n * (o MCP já é só leitura sem ele). URL relativa é resolvida contra `origin`. */\nexport function buildMcpConfig(servers: readonly SpineMcpServer[], token: string, write: boolean, origin: string): string {\n const mcpServers: Record<string, { type: 'http'; url: string; headers: Record<string, string> }> = {};\n for (const server of servers) {\n const headers: Record<string, string> = { 'x-app-token': token };\n const scopes = write && server.writeScopes ? server.writeScopes : server.readScopes;\n if (scopes) headers['x-mcp-scopes'] = scopes;\n mcpServers[server.name] = { type: 'http', url: new URL(server.url, origin).href, headers };\n }\n return JSON.stringify({ mcpServers }, null, 2);\n}\n\n/**\n * Sessões › \"Conectar um agente de IA\" (`SpineFeatures.aiAgent`): em um passo, cria um token de aplicação pessoal\n * (`x-app-token`, a mesma API de \"Tokens de aplicação\") e monta a configuração MCP pronta para o Claude Code, com os\n * servidores que o app declarou e os escopos do acesso escolhido (só leitura ou leitura e escrita). O token aparece\n * uma única vez, dentro da configuração; nunca vai para o console nem para o armazenamento do navegador, e some ao\n * concluir ou fechar o painel.\n */\n@Component({\n selector: 'spine-ai-agent',\n imports: [ButtonComponent, CheckboxComponent, CodeViewerComponent, IconComponent, SegmentedControlComponent],\n template: `\n @if (!available) {\n <p class=\"sp-account__note\">{{ t.aiAgentUnavailable }}</p>\n } @else if (result(); as r) {\n <div class=\"sp-account__panel sp-account__panel--success\" role=\"status\">\n <div class=\"sp-account__panel-head\">\n <hm-icon shape=\"check-circle\" />\n <div class=\"sp-account__panel-text\">\n <p class=\"sp-account__title\">{{ t.aiAgentResult }}</p>\n <p class=\"sp-account__note\">{{ fmt(t.aiAgentResultHint, { date: r.expires }) }}</p>\n </div>\n </div>\n <hm-code-viewer [code]=\"r.config\" language=\"json\" filename=\".mcp.json\" [label]=\"t.aiAgentResult\" />\n <div class=\"sp-account__actions\">\n <hm-button size=\"small\" emphasis=\"high\" icon=\"copy\" (clicked)=\"copy()\">{{ t.aiAgentCopy }}</hm-button>\n <hm-button size=\"small\" emphasis=\"medium\" (clicked)=\"done()\">{{ t.aiAgentDone }}</hm-button>\n </div>\n </div>\n } @else if (open()) {\n <div class=\"sp-account__panel\">\n <div class=\"sp-account__form\">\n @if (servers.length > 1) {\n <fieldset class=\"sp-account__choices\">\n <legend class=\"sp-account__label\">{{ t.aiAgentServers }}</legend>\n @for (s of servers; track s.name) {\n <hm-checkbox [label]=\"serverLabel(s)\" [checked]=\"selected().has(s.name)\" (checkedChange)=\"toggleServer(s.name, $event)\" />\n }\n </fieldset>\n }\n @if (canWrite()) {\n <div class=\"sp-account__field\">\n <span class=\"sp-account__label\">{{ t.aiAgentAccess }}</span>\n <hm-segmented-control size=\"small\" emphasis=\"action\" [label]=\"t.aiAgentAccess\" [options]=\"accessOptions()\" [value]=\"access()\" (valueChange)=\"access.set($event === 'write' ? 'write' : 'read')\" />\n @if (access() === 'write') { <p class=\"sp-account__note\">{{ t.aiAgentWriteHint }}</p> }\n </div>\n }\n @if (badgeOptions().length > 1) {\n <div class=\"sp-account__field\">\n <span class=\"sp-account__label\">{{ tokens.accessLevel }}</span>\n <hm-segmented-control size=\"small\" emphasis=\"action\" [label]=\"tokens.accessLevel\" [options]=\"badgeOptions()\" [value]=\"badgeId()\" (valueChange)=\"badgeId.set($event)\" />\n </div>\n }\n <div class=\"sp-account__field\">\n <span class=\"sp-account__label\">{{ tokens.validity }}</span>\n <hm-segmented-control size=\"small\" emphasis=\"action\" [label]=\"tokens.validity\" [options]=\"validityOptions()\" [value]=\"validity()\" (valueChange)=\"validity.set($event)\" />\n </div>\n @if (!selected().size) { <p class=\"sp-account__note sp-account__note--error\">{{ t.aiAgentSelectServer }}</p> }\n @if (noBadges()) { <p class=\"sp-account__note sp-account__note--error\">{{ tokens.noBadges }}</p> }\n </div>\n <div class=\"sp-account__actions\">\n <hm-button size=\"small\" emphasis=\"medium\" [disabled]=\"submitting()\" (clicked)=\"cancel()\">{{ tokens.cancel }}</hm-button>\n <hm-button size=\"small\" emphasis=\"high\" icon=\"plugin\" [loading]=\"submitting()\" [disabled]=\"!canSubmit()\" (clicked)=\"generate()\">{{ t.aiAgentGenerate }}</hm-button>\n </div>\n </div>\n } @else {\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"medium\" icon=\"plugin\" [loading]=\"starting()\" (clicked)=\"start()\">{{ t.aiAgentStart }}</hm-button>\n </div>\n }\n `,\n styleUrl: './settings-blocks.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AiAgentComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly t = this.messages.accountFeatures;\n protected readonly tokens = this.messages.appTokens;\n protected readonly fmt = formatMessage;\n private readonly service = inject(SpineAppTokensService);\n private readonly toast = inject(HermesToastService);\n private readonly preferences = inject(SpinePreferencesService);\n\n protected readonly available = this.service.available;\n protected readonly servers: readonly SpineMcpServer[] = inject(SPINE_CONFIG, { optional: true })?.features?.aiAgent?.servers ?? [];\n\n protected readonly open = signal(false);\n protected readonly starting = signal(false);\n protected readonly submitting = signal(false);\n protected readonly selected = signal<ReadonlySet<string>>(new Set(this.servers.map((s) => s.name)));\n protected readonly access = signal<'read' | 'write'>('read');\n protected readonly badges = signal<{ id: string; name: string }[]>([]);\n protected readonly badgeId = signal('');\n protected readonly validity = signal('90');\n /** Configuração gerada (com o token), mostrada uma única vez. */\n protected readonly result = signal<{ config: string; expires: string } | null>(null);\n\n protected readonly canWrite = computed(() => this.servers.some((s) => s.writeScopes && this.selected().has(s.name)));\n protected readonly noBadges = computed(() => !this.badges().length);\n protected readonly canSubmit = computed(() => !!this.selected().size && !!this.badgeId() && !this.submitting());\n protected readonly accessOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'read', label: this.t.aiAgentReadOnly },\n { value: 'write', label: this.t.aiAgentReadWrite },\n ]);\n protected readonly badgeOptions = computed<readonly SegmentedOption[]>(() => this.badges().map((b) => ({ value: b.id, label: b.name })));\n protected readonly validityOptions = computed<readonly SegmentedOption[]>(() => [\n { value: '30', label: this.tokens.days30 },\n { value: '90', label: this.tokens.days90 },\n { value: '180', label: this.tokens.months6 },\n { value: '365', label: this.tokens.year1 },\n ]);\n\n protected serverLabel(server: SpineMcpServer): string {\n const label = server.label ?? server.name;\n return server.writeScopes ? label : formatMessage(this.t.aiAgentReadOnlyServer, { name: label });\n }\n\n protected toggleServer(name: string, checked: boolean): void {\n const next = new Set(this.selected());\n if (checked) next.add(name);\n else next.delete(name);\n this.selected.set(next);\n }\n\n protected async start(): Promise<void> {\n this.starting.set(true);\n try {\n const { badges } = await this.service.options();\n this.badges.set(badges);\n this.badgeId.set(badges[0]?.id ?? '');\n this.access.set('read');\n this.validity.set('90');\n this.open.set(true);\n } catch (err) {\n this.toast.error(errorDetail(err) || this.tokens.badgesError);\n } finally {\n this.starting.set(false);\n }\n }\n\n protected cancel(): void {\n this.open.set(false);\n }\n\n protected async generate(): Promise<void> {\n if (!this.canSubmit()) return;\n this.submitting.set(true);\n try {\n const date = new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeZone: this.preferences.effectiveTimeZone() }).format(new Date());\n const created = await this.service.create({\n badge_id: this.badgeId(),\n name: formatMessage(this.t.aiAgentTokenName, { date }).slice(0, 80),\n validity_days: Number(this.validity()),\n });\n const servers = this.servers.filter((s) => this.selected().has(s.name));\n const write = this.access() === 'write' && this.canWrite();\n this.result.set({\n config: buildMcpConfig(servers, created.token, write, location.origin),\n expires: new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeZone: this.preferences.effectiveTimeZone() })\n .format(new Date(created.expires_at)),\n });\n this.open.set(false);\n } catch (err) {\n this.toast.error(errorDetail(err) || this.t.aiAgentCreateError);\n } finally {\n this.submitting.set(false);\n }\n }\n\n protected async copy(): Promise<void> {\n const config = this.result()?.config;\n if (!config) return;\n try {\n await navigator.clipboard.writeText(config);\n this.toast.success(this.t.aiAgentCopied);\n } catch {\n this.toast.error(this.tokens.copyFailed);\n }\n }\n\n protected done(): void {\n this.result.set(null);\n }\n}\n\nfunction errorDetail(err: unknown): string {\n return err instanceof HttpErrorResponse ? ((err.error?.detail as string | undefined) ?? '') : '';\n}\n","import { ChangeDetectionStrategy, Component, inject, signal, viewChild } from '@angular/core';\nimport { AlertComponent, HermesToastService, SelectComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineAccountSecurityService } from './account-security.service';\n\n/**\n * Crachá padrão (Conta › \"Crachá padrão\", `SpineFeatures.defaultBadge`): o nível de acesso com que o login entra\n * nesta aplicação, guardado no Argos por usuário e aplicação (`GET/PUT {api}/badges`) — vale em qualquer navegador.\n * \"Automático\" volta à regra do Argos (o crachá de menor nível). A troca no menu do perfil continua valendo só para a\n * sessão.\n */\n@Component({\n selector: 'spine-default-badge',\n imports: [AlertComponent, SelectComponent],\n template: `\n @if (loadError()) {\n <hm-alert variant=\"error\">{{ t.defaultBadgeLoadError }}</hm-alert>\n } @else {\n <hm-select\n class=\"sp-settings__badge\"\n [label]=\"t.defaultBadge\"\n [labelHidden]=\"true\"\n [value]=\"value()\"\n [disabled]=\"loading() || saving()\"\n (valueChange)=\"save($event ?? '')\"\n >\n <option value=\"\">{{ t.defaultBadgeAuto }}</option>\n @for (b of badges(); track b.id) {\n <option [value]=\"b.id\">{{ b.name }}</option>\n }\n </hm-select>\n }\n `,\n styles: [`:host { display: block; min-width: 0; } .sp-settings__badge { min-inline-size: 14rem; max-inline-size: 100%; }`],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DefaultBadgeComponent {\n private readonly api = inject(SpineAccountSecurityService);\n private readonly toast = inject(HermesToastService);\n protected readonly t = inject(SPINE_MESSAGES).accountFeatures;\n\n protected readonly badges = signal<{ id: string; name: string }[]>([]);\n protected readonly value = signal('');\n protected readonly loading = signal(true);\n protected readonly saving = signal(false);\n protected readonly loadError = signal(false);\n private readonly select = viewChild(SelectComponent);\n\n constructor() {\n void this.load();\n }\n\n private async load(): Promise<void> {\n try {\n const result = await this.api.badges();\n this.badges.set(result.badges ?? []);\n this.value.set(result.default_badge_id ?? '');\n } catch {\n this.loadError.set(true);\n } finally {\n this.loading.set(false);\n }\n }\n\n protected async save(value: string): Promise<void> {\n const previous = this.value();\n if (value === previous) return;\n this.value.set(value);\n this.saving.set(true);\n try {\n const result = await this.api.setDefaultBadge(value || null);\n this.value.set(result.default_badge_id ?? '');\n this.toast.success(this.t.defaultBadgeSaved);\n } catch {\n this.value.set(previous);\n // O <select> já mostra a escolha recusada: volta ao valor salvo.\n this.select()?.value.set(previous);\n this.toast.error(this.t.defaultBadgeError);\n } finally {\n this.saving.set(false);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { AlertComponent, ButtonComponent, HermesToastService, IconComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { pluralMessage } from '@trismegisto/primitives';\nimport { SpineAccountSecurityState } from './account-security.state';\nimport { AccountReauthComponent } from './account-reauth.component';\n\nlet sequence = 0;\n\n/**\n * Códigos de recuperação da conta no Argos: quantos restam e \"gerar novos\" (com reautenticação). O lote\n * novo aparece UMA vez (o Argos só guarda o hash), com copiar e baixar em .txt, até a pessoa dizer que\n * guardou — e some quando o painel fecha.\n */\n@Component({\n selector: 'spine-account-recovery-codes',\n imports: [AlertComponent, ButtonComponent, IconComponent, AccountReauthComponent],\n template: `\n @if (state.overview()) {\n @if (state.owner() === 'codes') {\n @if (state.notice(); as notice) {\n <hm-alert variant=\"success\">{{ t.notices[notice] }}</hm-alert>\n }\n @if (state.error(); as error) {\n <hm-alert variant=\"error\">{{ errorText(error) }}</hm-alert>\n }\n }\n\n @if (state.owner() === 'codes' && state.step() === 'reauth') {\n <spine-account-reauth />\n } @else if (state.owner() === 'codes' && state.step() === 'codes' && state.issuedCodes(); as codes) {\n <section class=\"sp-account__panel sp-account__panel--success\" [attr.aria-labelledby]=\"titleId\">\n <div class=\"sp-account__panel-head\">\n <hm-icon shape=\"key\" />\n <div class=\"sp-account__panel-text\">\n <h4 class=\"sp-account__title\" [id]=\"titleId\">{{ t.codesTitle }}</h4>\n <p class=\"sp-account__note\">{{ t.codesShownOnce }}</p>\n </div>\n </div>\n <ol class=\"sp-account__codes\">\n @for (code of codes; track code) {\n <li><code>{{ code }}</code></li>\n }\n </ol>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"high\" (clicked)=\"state.codesSaved()\">{{ t.codesSaved }}</hm-button>\n <hm-button emphasis=\"medium\" icon=\"copy\" (clicked)=\"copy(codes)\">{{ t.copyCodes }}</hm-button>\n <hm-button emphasis=\"medium\" icon=\"download\" (clicked)=\"download(codes)\">{{ t.downloadCodes }}</hm-button>\n </div>\n </section>\n } @else {\n <ul class=\"sp-account__list\">\n <li class=\"sp-account__item\">\n <span class=\"sp-account__icon\" [class.sp-account__icon--accent]=\"state.remainingCodes() > 0\"><hm-icon shape=\"key\" /></span>\n <span class=\"sp-account__item-main\">\n @if (state.activeMethods().length) {\n <span class=\"sp-account__item-title\"><strong>{{ remaining() }}</strong></span>\n <span class=\"sp-account__meta\">{{ t.codesHint }}</span>\n } @else {\n <span class=\"sp-account__meta\">{{ t.codesNeedMethod }}</span>\n }\n </span>\n @if (state.activeMethods().length) {\n <span class=\"sp-account__item-actions\">\n <hm-button size=\"small\" emphasis=\"medium\" [disabled]=\"state.busy() || state.step() !== 'idle'\" (clicked)=\"state.start({ kind: 'codes' })\">\n {{ state.remainingCodes() ? t.regenerateCodes : t.generateCodes }}\n </hm-button>\n </span>\n }\n </li>\n </ul>\n }\n }\n `,\n styleUrl: './settings-blocks.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountRecoveryCodesComponent {\n protected readonly state = inject(SpineAccountSecurityState);\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly t = this.messages.accountSecurity;\n private readonly toast = inject(HermesToastService);\n protected readonly titleId = `sp-account-codes-${++sequence}`;\n\n protected readonly remaining = computed(() =>\n pluralMessage(this.t.codesRemaining, this.state.remainingCodes(), this.messages.meta.locale));\n\n protected errorText(code: string): string {\n return (this.t.errors as Record<string, string>)[code] ?? this.t.errors.generic;\n }\n\n private asText(codes: readonly string[]): string {\n return `${this.t.codesFileHeader}\\n\\n${codes.join('\\n')}\\n`;\n }\n\n protected async copy(codes: readonly string[]): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.asText(codes));\n this.toast.success(this.t.codesCopied);\n } catch {\n this.toast.error(this.t.copyFailed);\n }\n }\n\n protected download(codes: readonly string[]): void {\n const url = URL.createObjectURL(new Blob([this.asText(codes)], { type: 'text/plain;charset=utf-8' }));\n const a = document.createElement('a');\n a.href = url;\n a.download = this.t.codesFileName;\n a.click();\n // Revogar no mesmo tick pode cancelar o download em alguns navegadores (o clique só agenda a navegação).\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport { AlertComponent, ButtonComponent, IconComponent, TagComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES, SpinePreferencesService } from '@trismegisto/spine';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives';\nimport { AccountSession, SpineAccountSecurityService, accountErrorCode } from './account-security.service';\n\n/**\n * Sessões e dispositivos da conta no Argos, dentro do painel de configurações: onde a conta está\n * conectada (navegador, IP, aplicativos, último uso), com a sessão deste login marcada. Encerra uma\n * sessão (segundo clique confirma) ou todas as outras. A sessão atual não tem \"Encerrar\" aqui: sair dela é\n * o \"Sair\" da seção Conta, que também encerra o app.\n */\n@Component({\n selector: 'spine-account-sessions',\n imports: [AlertComponent, ButtonComponent, IconComponent, TagComponent],\n templateUrl: './account-sessions.component.html',\n styleUrl: './settings-blocks.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AccountSessionsComponent {\n private readonly api = inject(SpineAccountSecurityService);\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly t = this.messages.accountSecurity;\n private readonly preferences = inject(SpinePreferencesService);\n\n protected readonly loading = signal(true);\n protected readonly loadError = signal('');\n protected readonly sessions = signal<AccountSession[]>([]);\n protected readonly notice = signal('');\n protected readonly error = signal('');\n /** Encerramento aguardando o segundo clique: id da sessão, `others` ou null. */\n protected readonly confirming = signal<string | null>(null);\n protected readonly busy = signal(false);\n\n /** A deste login primeiro; depois as outras, da usada mais recentemente. */\n protected readonly ordered = computed(() =>\n [...this.sessions()].sort((a, b) => Number(b.current) - Number(a.current) || b.last_seen_at.localeCompare(a.last_seen_at)));\n protected readonly others = computed(() => this.sessions().filter((s) => !s.current).length);\n protected readonly othersConfirm = computed(() =>\n pluralMessage(this.t.endOthersConfirm, this.others(), this.messages.meta.locale));\n\n constructor() {\n if (this.api.available) void this.load();\n else this.loading.set(false);\n }\n\n protected async load(): Promise<void> {\n this.loading.set(true);\n try {\n const { sessions } = await this.api.sessions();\n this.sessions.set(sessions ?? []);\n this.loadError.set('');\n } catch (err) {\n this.loadError.set(accountErrorCode(err) || 'generic');\n } finally {\n this.loading.set(false);\n }\n }\n\n protected ask(target: string): void {\n this.notice.set('');\n this.error.set('');\n this.confirming.set(target);\n }\n\n protected cancel(): void {\n this.confirming.set(null);\n }\n\n protected async end(session: AccountSession): Promise<void> {\n if (this.confirming() !== session.id) {\n this.ask(session.id);\n return;\n }\n await this.run(async () => {\n await this.api.endSession(session.id);\n this.notice.set(this.t.sessionEndedNotice);\n });\n }\n\n protected async endOthers(): Promise<void> {\n await this.run(async () => {\n const { ended } = await this.api.endOtherSessions();\n this.notice.set(pluralMessage(this.t.othersEndedNotice, ended, this.messages.meta.locale));\n });\n }\n\n private async run(fn: () => Promise<void>): Promise<void> {\n if (this.busy()) return;\n this.busy.set(true);\n this.error.set('');\n try {\n await fn();\n } catch (err) {\n const code = accountErrorCode(err) || 'generic';\n if (code === 'login_required' || code === 'invalid_token') {\n this.loadError.set(code);\n } else {\n this.error.set(this.errorText(code));\n }\n } finally {\n this.confirming.set(null);\n this.busy.set(false);\n }\n if (!this.loadError()) await this.load();\n }\n\n protected errorText(code: string): string {\n return (this.t.errors as Record<string, string>)[code] ?? this.t.errors.generic;\n }\n\n protected detail(session: AccountSession): string {\n return formatMessage(this.t.sessionDetail, { ip: session.ip || this.t.unknownIp, date: this.date(session.last_seen_at) });\n }\n\n protected since(session: AccountSession): string {\n return formatMessage(this.t.sessionSince, { date: this.date(session.created_at) });\n }\n\n protected apps(session: AccountSession): string {\n return formatMessage(this.t.sessionApps, { apps: session.clients.map((c) => c.name ?? this.t.unnamedApp).join(', ') });\n }\n\n private date(value: string): string {\n return new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() })\n .format(new Date(value));\n }\n}\n","@if (loading() && !sessions().length) {\n <p class=\"sp-account__note\" role=\"status\">{{ t.loading }}</p>\n} @else if (loadError()) {\n <hm-alert variant=\"error\">{{ errorText(loadError()) }}</hm-alert>\n @if (loadError() !== 'login_required' && loadError() !== 'invalid_token') {\n <div class=\"sp-account__actions\">\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"refresh\" (clicked)=\"load()\">{{ t.retry }}</hm-button>\n </div>\n }\n} @else {\n @if (notice()) {\n <hm-alert variant=\"success\">{{ notice() }}</hm-alert>\n }\n @if (error()) {\n <hm-alert variant=\"error\">{{ error() }}</hm-alert>\n }\n\n <div class=\"sp-account__list\">\n <ul class=\"sp-account__items\">\n @for (s of ordered(); track s.id) {\n <li class=\"sp-account__item\">\n <span class=\"sp-account__icon\" [class.sp-account__icon--accent]=\"s.current\"><hm-icon [shape]=\"s.device.mobile ? 'mobile' : 'computer'\" /></span>\n <span class=\"sp-account__item-main\">\n <span class=\"sp-account__item-title\">\n <strong>{{ s.device.label }}</strong>\n @if (s.current) {\n <hm-tag [name]=\"t.thisSession\" color=\"success\" />\n } @else if (s.this_device) {\n <hm-tag [name]=\"t.thisBrowser\" color=\"info\" />\n }\n @if (!s.sso_active) {\n <hm-tag [name]=\"t.appsOnly\" color=\"warning\" />\n }\n </span>\n <span class=\"sp-account__meta\">{{ detail(s) }}</span>\n <span class=\"sp-account__meta\">{{ since(s) }}@if (s.clients.length) { · {{ apps(s) }} }</span>\n </span>\n @if (!s.current) {\n <span class=\"sp-account__item-actions\">\n @if (confirming() === s.id) {\n <hm-button size=\"small\" emphasis=\"medium\" [disabled]=\"busy()\" (clicked)=\"cancel()\">{{ t.cancel }}</hm-button>\n }\n <hm-button size=\"small\" [emphasis]=\"confirming() === s.id ? 'high' : 'medium'\" intent=\"danger\" [loading]=\"busy() && confirming() === s.id\" [disabled]=\"busy() && confirming() !== s.id\" (clicked)=\"end(s)\">\n {{ confirming() === s.id ? t.confirmEndSession : t.endSession }}\n </hm-button>\n </span>\n }\n </li>\n } @empty {\n <li class=\"sp-account__item sp-account__item--empty\">{{ t.sessionsEmpty }}</li>\n }\n </ul>\n\n @if (others() > 0) {\n <div class=\"sp-account__list-footer\">\n @if (confirming() === 'others') {\n <span class=\"sp-account__note\">{{ othersConfirm() }}</span>\n <span class=\"sp-account__actions\">\n <hm-button size=\"small\" emphasis=\"medium\" [disabled]=\"busy()\" (clicked)=\"cancel()\">{{ t.cancel }}</hm-button>\n <hm-button size=\"small\" emphasis=\"high\" intent=\"danger\" icon=\"logout\" [loading]=\"busy()\" (clicked)=\"endOthers()\">{{ t.endOthers }}</hm-button>\n </span>\n } @else {\n <hm-button size=\"small\" emphasis=\"medium\" intent=\"danger\" icon=\"logout\" [disabled]=\"busy()\" (clicked)=\"ask('others')\">{{ t.endOthers }}</hm-button>\n }\n </div>\n }\n </div>\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { FormControl, Validators, ReactiveFormsModule } from '@angular/forms';\nimport {\n ButtonComponent,\n InputComponent,\n HermesToastService,\n IconComponent,\n SegmentedControlComponent,\n SegmentedOption,\n} from '@trismegisto/angular';\nimport { SpinePreferencesService, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AppToken, SpineAppTokensService } from './app-tokens.service';\nimport { formatMessage, formatMessageHtml } from '@trismegisto/primitives';\n\nlet sequence = 0;\n\n/** Validades oferecidas (dias). O servidor recusa acima de 365 — o CHECK no banco também. */\n\n/**\n * Tokens de aplicação do usuário (seção Conta do painel de configurações): lista, criação e\n * revogação. O valor do token só aparece uma vez, logo depois de criado, e some quando o painel\n * fecha (o componente vive dentro do `@if` do painel).\n */\n@Component({\n selector: 'spine-app-tokens',\n imports: [ReactiveFormsModule, ButtonComponent, InputComponent, IconComponent, SegmentedControlComponent],\n templateUrl: './app-tokens.component.html',\n styleUrl: './settings-blocks.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppTokensComponent {\n protected readonly text = inject(SPINE_MESSAGES).appTokens;\n protected readonly fmt = formatMessage;\n /** Para `[innerHTML]`: escapa os parâmetros (o nome da aplicação vem do servidor). */\n protected readonly fmtHtml = formatMessageHtml;\n private readonly locale = inject(SPINE_MESSAGES);\n private readonly service = inject(SpineAppTokensService);\n private readonly toast = inject(HermesToastService);\n private readonly preferences = inject(SpinePreferencesService);\n\n protected readonly available = this.service.available;\n protected readonly ids = `sp-tokens-${++sequence}`;\n protected readonly loading = signal(true);\n protected readonly loadError = signal('');\n protected readonly tokens = signal<AppToken[]>([]);\n protected readonly maxActive = signal(10);\n\n protected readonly validCount = computed(() => this.tokens().filter((t) => !t.expired).length);\n protected readonly atLimit = computed(() => this.validCount() >= this.maxActive());\n\n // ── criação ─────────────────────────────────────────────────────────────────\n protected readonly creating = signal(false);\n protected readonly submitting = signal(false);\n /** Nome da aplicação logada (a única para a qual dá pra criar token aqui). */\n protected readonly clientName = signal('');\n protected readonly badges = signal<{ id: string; name: string }[]>([]);\n protected readonly badgeId = signal('');\n protected readonly validity = signal('90');\n protected readonly nameControl = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.maxLength(80)] });\n protected readonly validityOptions = computed<readonly SegmentedOption[]>(() => [\n { value: '30', label: this.text.days30 },\n { value: '90', label: this.text.days90 },\n { value: '180', label: this.text.months6 },\n { value: '365', label: this.text.year1 },\n ]);\n\n protected readonly badgeOptions = computed<SegmentedOption[]>(() =>\n this.badges().map((b) => ({ value: b.id, label: b.name })),\n );\n\n /** Token recém-criado, mostrado uma única vez. */\n protected readonly created = signal<{ name: string; token: string; expiresAt: string } | null>(null);\n /** Token com a revogação aguardando confirmação (segundo clique). */\n protected readonly confirmingRevoke = signal<string | null>(null);\n\n constructor() {\n if (this.available) void this.load();\n else this.loading.set(false);\n // Token criado em outro lugar do painel (\"Conectar um agente de IA\"): relê a lista. O que esta lista cria já relê.\n let seen = this.service.changes();\n effect(() => {\n const changes = this.service.changes();\n if (changes === seen) return;\n seen = changes;\n if (!untracked(this.submitting)) void untracked(() => this.load());\n });\n }\n\n private async load(): Promise<void> {\n this.loading.set(true);\n this.loadError.set('');\n try {\n const list = await this.service.list();\n this.tokens.set(list.tokens);\n this.maxActive.set(list.max_active);\n } catch (err) {\n this.loadError.set(this.errorText(err, this.text.loadError));\n } finally {\n this.loading.set(false);\n }\n }\n\n protected async startCreate(): Promise<void> {\n this.created.set(null);\n this.nameControl.reset('');\n this.validity.set('90');\n this.creating.set(true);\n try {\n const { client, badges } = await this.service.options();\n this.clientName.set(client.name ?? '');\n this.badges.set(badges);\n // Um nível só: já vem escolhido. Vários: o de maior nível vem primeiro (ordem do servidor).\n this.badgeId.set(badges[0]?.id ?? '');\n } catch (err) {\n this.toast.error(this.errorText(err, this.text.badgesError));\n this.creating.set(false);\n }\n }\n\n protected cancelCreate(): void {\n this.creating.set(false);\n }\n\n protected readonly canSubmit = computed(() => !!this.badgeId() && !this.submitting());\n\n protected async submit(): Promise<void> {\n this.nameControl.markAsTouched();\n if (!this.canSubmit() || this.nameControl.invalid) return;\n this.submitting.set(true);\n try {\n const name = this.nameControl.value.trim();\n const result = await this.service.create({\n badge_id: this.badgeId(),\n name,\n validity_days: Number(this.validity()),\n });\n this.created.set({ name, token: result.token, expiresAt: result.expires_at });\n this.creating.set(false);\n await this.load();\n } catch (err) {\n this.toast.error(this.errorText(err, this.text.createError));\n } finally {\n this.submitting.set(false);\n }\n }\n\n protected async copyCreated(): Promise<void> {\n const token = this.created()?.token;\n if (!token) return;\n try {\n await navigator.clipboard.writeText(token);\n this.toast.success(this.text.copied);\n } catch {\n this.toast.error(this.text.copyFailed);\n }\n }\n\n protected dismissCreated(): void {\n this.created.set(null);\n }\n\n protected async revoke(token: AppToken): Promise<void> {\n if (this.confirmingRevoke() !== token.id) {\n this.confirmingRevoke.set(token.id);\n return;\n }\n this.confirmingRevoke.set(null);\n try {\n await this.service.revoke(token.id);\n this.tokens.update((list) => list.filter((t) => t.id !== token.id));\n this.toast.success(formatMessage(this.text.revoked, { name: token.name }));\n } catch (err) {\n this.toast.error(this.errorText(err, this.text.revokeError));\n }\n }\n\n protected cancelRevoke(): void {\n this.confirmingRevoke.set(null);\n }\n\n protected formatDate(value: string | null): string {\n if (!value) return this.text.never;\n return new Intl.DateTimeFormat(this.locale.meta.locale, { dateStyle: 'short', timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() })\n .format(new Date(value));\n }\n\n private errorText(err: unknown, fallback: string): string {\n const detail = err instanceof HttpErrorResponse ? (err.error?.detail as string | undefined) : undefined;\n return detail || fallback;\n }\n}\n","@if (!available) {\n <p class=\"sp-account__note\">{{ text.unavailable }}</p>\n} @else {\n <!-- Token recém-criado: única vez em que o valor aparece. -->\n @if (created(); as c) {\n <section class=\"sp-account__panel sp-account__panel--success\" role=\"status\" [attr.aria-labelledby]=\"ids + '-created'\">\n <div class=\"sp-account__panel-head\">\n <hm-icon shape=\"check-circle\" />\n <div class=\"sp-account__panel-text\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-created'\">{{ fmt(text.created, { name: c.name }) }}</h4>\n <p class=\"sp-account__note\" [innerHTML]=\"fmtHtml(text.sendHeader, { date: formatDate(c.expiresAt) })\"></p>\n </div>\n </div>\n <code class=\"sp-account__secret sp-account__secret--block\">{{ c.token }}</code>\n <div class=\"sp-account__actions\">\n <hm-button emphasis=\"high\" icon=\"copy\" (clicked)=\"copyCreated()\">{{ text.copyToken }}</hm-button>\n <hm-button emphasis=\"medium\" (clicked)=\"dismissCreated()\">{{ text.saved }}</hm-button>\n </div>\n </section>\n }\n\n @if (loading()) {\n <p class=\"sp-account__note\" role=\"status\">{{ text.loading }}</p>\n } @else if (loadError()) {\n <p class=\"sp-account__note sp-account__note--error\">{{ loadError() }}</p>\n } @else {\n <div class=\"sp-account__list\">\n <ul class=\"sp-account__items\">\n @for (t of tokens(); track t.id) {\n <li class=\"sp-account__item\" [class.sp-account__item--muted]=\"t.expired\">\n <span class=\"sp-account__icon\" [class.sp-account__icon--accent]=\"!t.expired\"><hm-icon shape=\"key\" /></span>\n <span class=\"sp-account__item-main\">\n <span class=\"sp-account__item-title\"><strong>{{ t.name }}</strong></span>\n <span class=\"sp-account__meta\">{{ t.badge_name }} · <code>{{ t.prefix }}</code></span>\n <span class=\"sp-account__meta\">\n @if (t.expired) { <span class=\"sp-account__meta--danger\">{{ fmt(text.expiredOn, { date: formatDate(t.expires_at) }) }}</span> }\n @else { {{ fmt(text.expiresOn, { date: formatDate(t.expires_at) }) }} }\n · {{ fmt(text.lastUsed, { date: formatDate(t.last_used_at) }) }}\n </span>\n </span>\n <span class=\"sp-account__item-actions\">\n @if (confirmingRevoke() === t.id) {\n <hm-button size=\"small\" emphasis=\"medium\" (clicked)=\"cancelRevoke()\">{{ text.cancel }}</hm-button>\n }\n <hm-button size=\"small\" [emphasis]=\"confirmingRevoke() === t.id ? 'high' : 'medium'\" intent=\"danger\" (clicked)=\"revoke(t)\">\n {{ confirmingRevoke() === t.id ? text.confirmRevoke : text.revoke }}\n </hm-button>\n </span>\n </li>\n } @empty {\n <li class=\"sp-account__item sp-account__item--empty\">{{ text.empty }}</li>\n }\n </ul>\n\n @if (!creating()) {\n <div class=\"sp-account__list-footer\">\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"plus\" [disabled]=\"atLimit()\" (clicked)=\"startCreate()\">{{ text.newToken }}</hm-button>\n <span class=\"sp-account__note\">{{ atLimit() ? text.limit : fmt(text.validCount, { valid: validCount(), max: maxActive() }) }}</span>\n </div>\n }\n </div>\n\n @if (creating()) {\n <section class=\"sp-account__panel\" [attr.aria-labelledby]=\"ids + '-new'\">\n <div class=\"sp-account__panel-head\">\n <hm-icon shape=\"key\" />\n <div class=\"sp-account__panel-text\">\n <h4 class=\"sp-account__title\" [id]=\"ids + '-new'\">{{ text.newToken }}</h4>\n @if (clientName()) {\n <p class=\"sp-account__note\" [innerHTML]=\"fmtHtml(text.appOnly, { name: clientName() })\"></p>\n }\n </div>\n </div>\n <form class=\"sp-account__form\" (submit)=\"$event.preventDefault(); submit()\">\n @if (!badges().length) {\n <p class=\"sp-account__note\">{{ text.noBadges }}</p>\n } @else {\n @if (badgeOptions().length > 1) {\n <div class=\"sp-account__field\">\n <span class=\"sp-account__label\">{{ text.accessLevel }}</span>\n <hm-segmented-control emphasis=\"action\" [label]=\"text.accessLevel\" [options]=\"badgeOptions()\" [value]=\"badgeId()\" (valueChange)=\"badgeId.set($event)\" />\n </div>\n }\n <hm-input [label]=\"text.name\" [placeholder]=\"text.namePlaceholder\" [formControl]=\"nameControl\" [messages]=\"{ required: text.nameRequired, maxlength: text.nameMax }\" />\n <div class=\"sp-account__field\">\n <span class=\"sp-account__label\">{{ text.validity }}</span>\n <hm-segmented-control emphasis=\"action\" [label]=\"text.validity\" [options]=\"validityOptions()\" [value]=\"validity()\" (valueChange)=\"validity.set($event)\" />\n </div>\n }\n <div class=\"sp-account__actions\">\n @if (badges().length) {\n <hm-button type=\"submit\" emphasis=\"high\" icon=\"key\" [disabled]=\"!canSubmit()\" [loading]=\"submitting()\">{{ text.create }}</hm-button>\n }\n <hm-button emphasis=\"medium\" (clicked)=\"cancelCreate()\">{{ text.cancel }}</hm-button>\n </div>\n </form>\n </section>\n }\n }\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, isDevMode, signal } from '@angular/core';\nimport { AUTH_CONFIG, AuthorizationService } from '@orfeu/angular/core';\nimport { AccountAvatarComponent, ButtonComponent, ComboboxComponent, CheckboxComponent, ComboboxOption, HERMES_SIDEBAR_CONFIG, HERMES_THEME_CONFIG, HermesDensity, HermesI18nService, HermesSidebarService, HermesThemeMode, HermesThemeService, HermesToastService, SegmentedControlComponent, SegmentedOption, SettingsDialogComponent, SettingsRowComponent, SettingsSectionComponent, ShortcutListComponent, ThemePickerComponent, SelectComponent, ToggletipComponent } from '@trismegisto/angular';\nimport { APP_PACKAGE_INFO, DensityService, SPINE_CONFIG, SPINE_USER_STORAGE_KEYS, SpineHourCyclePreference, SpinePreferencesService, SpineStartPagePreference, SpineQuickAccessService, SpineUserStorage, SpineUserStorageKey, ThemePresetService, ThemeService, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { FALLBACK_FAMILY, HERMES_FONTS, HERMES_TEXT_SCALES, HermesFont, HermesMotionPreference, Weekday, formatMessage, pluralMessage, weekdayNames } from '@trismegisto/primitives';\nimport { SpineNewsService } from '../news/news.service';\nimport { OnboardingService } from '../onboarding/onboarding.service';\nimport { Router } from '@angular/router';\nimport { SpineAccountPreferencesService } from '../account-preferences/account-preferences.service';\nimport { SpineIdleService } from '../idle/idle.service';\nimport { SpineNoticesService } from '../notices/notices.service';\nimport { SpineStartPageService } from '../start-page/start-page.service';\nimport { AccountActivityComponent } from './account-activity.component';\nimport { AccountMfaComponent } from './account-mfa.component';\nimport { AiAgentComponent } from './ai-agent.component';\nimport { DefaultBadgeComponent } from './default-badge.component';\nimport { AccountRecoveryCodesComponent } from './account-recovery-codes.component';\nimport { SpineAccountSecurityService } from './account-security.service';\nimport { SpineAccountSecurityScopeDirective } from './account-security.state';\nimport { AccountSessionsComponent } from './account-sessions.component';\nimport { AppTokensComponent } from './app-tokens.component';\nimport { ShortcutService } from '../shortcuts/shortcut.service';\nimport { SpineLogoutService } from '../logout/logout.service';\nimport { SPINE_SETTINGS_KEYS, SPINE_SETTINGS_SECTIONS, SpineSettingsService, resolveSettingsSection } from './settings.service';\n\n/** Dependências que valem mostrar em \"Sobre\" (as demais são detalhe de build). */\n// check-strings: off — nomes de produto, não se traduzem.\nconst KEY_DEPENDENCIES: readonly { name: string; label: string }[] = [\n { name: '@angular/core', label: 'Angular' },\n { name: '@trismegisto/angular', label: 'Hermes DS' },\n { name: '@trismegisto/spine', label: 'Hermes Spine' },\n { name: '@orfeu/angular', label: 'Orfeu' },\n { name: 'apollo-angular', label: 'Apollo' },\n { name: 'graphql', label: 'GraphQL' },\n { name: 'rxjs', label: 'RxJS' },\n // check-strings: on\n];\n\n/** Uma lista guardada neste navegador que a seção \"Dados do navegador\" limpa. */\ntype BrowserList = 'recents' | 'searches' | 'favorites';\n\n/** Lista → chave do `SpineUserStorage` (por usuário). */\nconst BROWSER_LISTS: Readonly<Record<BrowserList, SpineUserStorageKey>> = {\n recents: SPINE_USER_STORAGE_KEYS.recents,\n searches: SPINE_USER_STORAGE_KEYS.recentSearches,\n favorites: SPINE_USER_STORAGE_KEYS.favorites,\n};\n\n/**\n * Painel de configurações do shell (substitui as telas do antigo módulo \"Sistema\"): Conta (perfil, nível,\n * sessão, sair), MFA (verificação em duas etapas e códigos de recuperação do Argos), Sessões (token de\n * acesso, tokens de aplicação e sessões e dispositivos do Argos), Aparência, Acessibilidade (tamanho do texto,\n * animações), Região (idioma, fuso, formato de hora, primeiro dia da semana), Atalhos, Dados do navegador\n * (limpar listas, restaurar preferências), Ajuda (novidades, tour) e Sobre, mais as seções que o app registrar\n * com `provideSettingsSection`. Tudo vale na hora — cada controle chama o serviço que já persiste aquela\n * preferência (tema, densidade, menu lateral, fuso, tamanho do texto…).\n *\n * Aberto por `SpineSettingsService.open()` — menu do perfil, `Ctrl+,` ou `?settings=<seção>`.\n */\n@Component({\n selector: 'spine-settings-panel',\n imports: [\n NgComponentOutlet, AppTokensComponent, AiAgentComponent, AccountActivityComponent, DefaultBadgeComponent, CheckboxComponent,\n AccountMfaComponent, AccountRecoveryCodesComponent, AccountSessionsComponent, SpineAccountSecurityScopeDirective,\n AccountAvatarComponent, ButtonComponent, ComboboxComponent,\n SegmentedControlComponent, SettingsDialogComponent, SettingsRowComponent, SettingsSectionComponent,\n SelectComponent, ShortcutListComponent, ThemePickerComponent, ToggletipComponent,\n ],\n templateUrl: './settings-panel.component.html',\n styleUrl: './settings-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SettingsPanelComponent {\n protected readonly settings = inject(SpineSettingsService);\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.settings;\n protected readonly fmt = formatMessage;\n protected readonly keys = SPINE_SETTINGS_KEYS;\n /** Seção aberta, com a chave antiga já trocada pela nova (`seguranca` → `mfa`). */\n protected readonly activeSection = computed(() => resolveSettingsSection(this.settings.section()));\n\n private readonly theme = inject(ThemeService);\n private readonly hermesTheme = inject(HermesThemeService);\n private readonly themeConfig = inject(HERMES_THEME_CONFIG);\n private readonly sidebarConfig = inject(HERMES_SIDEBAR_CONFIG);\n private readonly i18n = inject(HermesI18nService);\n private readonly news = inject(SpineNewsService);\n private readonly quickAccess = inject(SpineQuickAccessService);\n private readonly userStorage = inject(SpineUserStorage);\n private readonly presets = inject(ThemePresetService);\n private readonly density = inject(DensityService);\n protected readonly sidebar = inject(HermesSidebarService);\n protected readonly preferences = inject(SpinePreferencesService);\n private readonly shortcutService = inject(ShortcutService);\n private readonly onboarding = inject(OnboardingService);\n private readonly auth = inject(AuthorizationService);\n private readonly authConfig = inject(AUTH_CONFIG, { optional: true });\n private readonly toast = inject(HermesToastService);\n protected readonly packageInfo = inject(APP_PACKAGE_INFO, { optional: true }) ?? {};\n private readonly config = inject(SPINE_CONFIG, { optional: true });\n protected readonly appSections = inject(SPINE_SETTINGS_SECTIONS, { optional: true }) ?? [];\n\n protected readonly appName = this.config?.appName ?? 'Hermes';\n /** Recursos opcionais ligados pelo app (`SpineConfig.features`). */\n protected readonly features = this.config?.features ?? {};\n protected readonly featureText = this.messages.accountFeatures;\n\n /**\n * \"Copiar token de acesso\" é ferramenta de desenvolvimento: põe o token da sessão (Bearer de tudo que a\n * pessoa pode fazer) na área de transferência, ao alcance de qualquer app/extensão que leia o clipboard.\n * Só aparece com `SpineConfig.technicalDocs` (sem configuração, só em `isDevMode()`), como a visão técnica.\n */\n protected readonly showAccessToken = this.config?.technicalDocs ?? isDevMode();\n\n // ── Aparência ───────────────────────────────────────────────────────────────\n protected readonly themeOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'light', label: this.text.themeLight, icon: 'sun' },\n { value: 'dark', label: this.text.themeDark, icon: 'moon' },\n { value: 'system', label: this.text.themeSystem, icon: 'computer' },\n ]);\n protected readonly densityOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'comfortable', label: this.text.comfortable },\n { value: 'compact', label: this.text.compact },\n ]);\n // As fontes do config (as da lib, ou as do app via `provideUi({ theme: { fonts, replaceFonts } })`).\n protected readonly fontOptions: readonly SegmentedOption[] = (this.hermesTheme.fonts ?? HERMES_FONTS).map((f) => ({ value: f.id, label: f.label }));\n protected readonly sidebarOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'auto', label: this.text.sidebarAuto },\n { value: 'fixed', label: this.text.sidebarFixed },\n { value: 'compact', label: this.text.sidebarCompact },\n ]);\n\n protected readonly themeMode = computed(() => this.hermesTheme.mode());\n protected readonly appliedTheme = computed(() => this.hermesTheme.theme());\n protected readonly family = computed(() => this.hermesTheme.family());\n protected readonly densityValue = computed(() => this.hermesTheme.density());\n protected readonly fontValue = computed(() => this.hermesTheme.font());\n protected readonly families = this.presets.families;\n\n protected setThemeMode(mode: string): void {\n this.theme.setMode(mode as HermesThemeMode);\n }\n\n protected setFamily(id: string): void {\n const family = this.families.find((f) => f.id === id);\n if (family) this.presets.setPreset(family);\n }\n\n protected setDensity(value: string): void {\n this.density.setDensity(value as HermesDensity);\n }\n\n protected setFont(value: string): void {\n this.hermesTheme.setFont(value as HermesFont);\n }\n\n protected setSidebarMode(value: string): void {\n this.sidebar.setMode(value as 'auto' | 'fixed' | 'compact');\n }\n\n // ── Acessibilidade ──────────────────────────────────────────────────────────\n /** 100%, 110%, 125%, 150% — no formato de porcentagem do idioma. */\n protected readonly textSizeOptions = computed<readonly SegmentedOption[]>(() => {\n const percent = new Intl.NumberFormat(this.i18n.formatLocale(), { style: 'percent', maximumFractionDigits: 0 });\n return HERMES_TEXT_SCALES.map((scale) => ({ value: String(scale), label: percent.format(scale) }));\n });\n protected readonly textSizeValue = computed(() => String(this.preferences.textScale()));\n\n protected readonly motionOptions = computed<readonly SegmentedOption[]>(() => [\n { value: 'system', label: this.text.motionSystem },\n { value: 'reduce', label: this.text.motionReduce },\n { value: 'full', label: this.text.motionFull },\n ]);\n\n protected setTextSize(value: string): void {\n this.preferences.setTextScale(Number(value));\n }\n\n protected setMotion(value: string): void {\n this.preferences.setMotion(value as HermesMotionPreference);\n }\n\n // ── Região ──────────────────────────────────────────────────────────────────\n protected readonly languageOptions = computed(() => {\n const appLanguage = this.preferences.languages.find((l) => l.value === this.preferences.appLanguage)?.label ?? this.preferences.appLanguage;\n return [\n { value: '', label: formatMessage(this.text.languageAuto, { language: appLanguage }) },\n ...this.preferences.languages,\n ];\n });\n\n /** ~400 fusos, cada um com o deslocamento calculado: só monta quando o painel abre pela\n * primeira vez, não no carregamento de toda página (o painel vive no layout desde o início). */\n private timeZoneCache: readonly ComboboxOption[] | null = null;\n protected readonly timeZoneOptions = computed<readonly ComboboxOption[]>(() => [\n { value: '', label: formatMessage(this.text.timeZoneAuto, { zone: this.preferences.browserTimeZone }) },\n ...(this.timeZoneCache ??= this.preferences\n .supportedTimeZones()\n .map((tz) => ({ value: tz, label: `${tz.replace(/_/g, ' ')} (${offsetOf(tz)})` }))),\n ]);\n\n /** Hora agora no fuso efetivo — prévia de como as datas vão aparecer. */\n protected readonly timeZonePreview = computed(() => {\n const zone = this.preferences.effectiveTimeZone();\n try {\n return new Intl.DateTimeFormat(this.i18n.formatLocale(), { dateStyle: 'short', timeStyle: 'short', timeZone: zone }).format(new Date())\n + ` (${offsetOf(zone)})`;\n } catch {\n return zone;\n }\n });\n\n protected readonly hourCycleOptions = computed<readonly SegmentedOption[]>(() => [\n { value: '', label: this.text.hourCycleAuto },\n { value: 'h23', label: this.text.hourCycle24 },\n { value: 'h12', label: this.text.hourCycle12 },\n ]);\n\n /** Hora agora, no relógio escolhido — prévia do formato. */\n protected readonly hourCyclePreview = computed(() => {\n try {\n return new Intl.DateTimeFormat(this.i18n.formatLocale(), { timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() }).format(new Date());\n } catch {\n return '';\n }\n });\n\n /** Automático, domingo e segunda — os nomes dos dias saem do `Intl`, no idioma. */\n protected readonly weekStartOptions = computed<readonly SegmentedOption[]>(() => {\n const names = weekdayNames(this.i18n.locale(), 'long', 0);\n return [\n { value: '', label: this.text.weekStartAuto },\n { value: '0', label: names[0] },\n { value: '1', label: names[1] },\n ];\n });\n protected readonly weekStartValue = computed(() => {\n const day = this.preferences.weekStart();\n return day === null ? '' : String(day);\n });\n\n protected setHourCycle(value: string): void {\n this.preferences.setHourCycle(value as SpineHourCyclePreference);\n }\n\n protected setWeekStart(value: string): void {\n this.preferences.setWeekStart(value === '' ? null : (Number(value) as Weekday));\n }\n\n // ── Atalhos ─────────────────────────────────────────────────────────────────\n /** Atalhos registrados (favoritos numa linha só) + os que outra peça dispara — os mesmos do painel \"?\". */\n protected readonly shortcutItems = this.shortcutService.panelItems;\n\n // ── Ajuda ───────────────────────────────────────────────────────────────────\n /** \"Ver novidades\" só quando o app tem alguma vigente (`provideSpineNews`). */\n protected readonly hasNews = this.news.hasAny;\n\n /** Fecha o painel antes: novidades e tour ocupam a tela. */\n protected showNews(): void {\n this.settings.close();\n this.news.showAll();\n }\n\n protected replayTour(): void {\n this.settings.close();\n this.onboarding.restart();\n }\n\n // ── Dados do navegador ──────────────────────────────────────────────────────\n /** Relida quando o painel abre e depois de limpar (as buscas recentes não têm sinal próprio). */\n private readonly dataVersion = signal(0);\n protected readonly counts = computed<Readonly<Record<BrowserList, number>>>(() => {\n this.dataVersion();\n this.settings.isOpen();\n return {\n recents: this.quickAccess.recents().length,\n searches: this.userStorage.count(BROWSER_LISTS.searches),\n favorites: this.quickAccess.favorites().length,\n };\n });\n /** As três listas, com a contagem já no texto da linha. */\n protected readonly browserLists = computed(() => {\n const counts = this.counts();\n const locale = this.i18n.formatLocale();\n const row = (id: BrowserList, label: string, keywords: string, count: string) => ({ id, label, keywords, count, empty: counts[id] === 0 });\n return [\n row('recents', this.text.recentPages, this.text.recentPagesKeywords, pluralMessage(this.text.pagesCount, counts.recents, locale)),\n row('searches', this.text.recentSearches, this.text.recentSearchesKeywords, pluralMessage(this.text.searchesCount, counts.searches, locale)),\n row('favorites', this.text.favorites, this.text.favoritesKeywords, pluralMessage(this.text.pagesCount, counts.favorites, locale)),\n ];\n });\n\n /** Ação destrutiva esperando confirmação (uma por vez, como nas listas do painel). */\n protected readonly confirming = signal<BrowserList | 'preferences' | null>(null);\n\n constructor() {\n // Painel fechado por qualquer caminho: a confirmação pendente não reaparece na próxima abertura.\n effect(() => {\n if (!this.settings.isOpen()) this.confirming.set(null);\n });\n }\n\n protected cancelConfirm(): void {\n this.confirming.set(null);\n }\n\n /** 1º clique pede confirmação; o 2º apaga a lista do usuário atual e avisa. */\n protected clearList(list: BrowserList): void {\n if (this.confirming() !== list) {\n this.confirming.set(list);\n return;\n }\n this.confirming.set(null);\n this.userStorage.clear(BROWSER_LISTS[list]);\n this.dataVersion.update((v) => v + 1);\n const done = { recents: this.text.recentPagesCleared, searches: this.text.recentSearchesCleared, favorites: this.text.favoritesCleared };\n this.toast.success(done[list]);\n }\n\n /**\n * Restaurar preferências (com confirmação): tema (sistema), cor principal (a padrão do app), densidade\n * (confortável), fonte (a padrão do app), menu lateral (o modo padrão do app), tamanho do texto (100%),\n * animações (sistema), formato de hora e primeiro dia da semana (automáticos). Idioma, fuso horário e\n * atalhos de tecla única ficam: mudam como a pessoa lê e digita, e não são \"aparência\".\n */\n protected restorePreferences(): void {\n if (this.confirming() !== 'preferences') {\n this.confirming.set('preferences');\n return;\n }\n this.confirming.set(null);\n const config = this.themeConfig;\n this.theme.setMode('system');\n const families = this.families;\n const knownFamily = (id: string | undefined) => !!id && families.some((f) => f.id === (config.aliases?.[id] ?? id));\n const family = [config.defaultFamily, FALLBACK_FAMILY, families[0]?.id].find(knownFamily);\n if (family) this.hermesTheme.setFamily(family);\n this.density.setDensity('comfortable');\n const fonts = this.hermesTheme.fonts ?? HERMES_FONTS;\n const knownFont = (id: string | undefined) => !!id && fonts.some((f) => f.id === (config.fontAliases?.[id] ?? id));\n const font = [config.defaultFont, 'geist', fonts[0]?.id].find(knownFont);\n if (font) this.hermesTheme.setFont(font);\n this.sidebar.setMode(this.sidebarConfig.defaultMode ?? 'auto');\n this.preferences.setTextScale(1);\n this.preferences.setMotion('system');\n this.preferences.setHourCycle('');\n this.preferences.setWeekStart(null);\n this.toast.success(this.text.preferencesRestored);\n }\n\n // ── Conta ───────────────────────────────────────────────────────────────────\n protected get profile() { return this.auth.profile; }\n protected get badge() { return this.auth.badge; }\n\n /** Validade da sessão lida do `exp` do próprio token (só leitura do payload, sem validar). */\n protected get sessionExpiry(): string {\n const exp = decodeTokenPayload(this.auth.getToken())?.['exp'];\n if (typeof exp !== 'number') return this.text.sessionUnknown;\n const at = new Date(exp * 1000);\n const minutes = Math.round((at.getTime() - Date.now()) / 60000);\n const when = new Intl.DateTimeFormat(this.i18n.formatLocale(), { timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() }).format(at);\n if (minutes <= 0) return formatMessage(this.text.sessionExpired, { time: when });\n return minutes < 60\n ? formatMessage(this.text.sessionExpiresIn, { minutes, time: when })\n : formatMessage(this.text.sessionExpiresAt, { time: when });\n }\n\n protected async copyToken(): Promise<void> {\n if (!this.showAccessToken) return;\n const token = this.auth.getToken();\n if (!token) { this.toast.warning(this.text.noSessionToken); return; }\n await this.copy(token, this.text.tokenCopied);\n }\n\n private readonly logoutService = inject(SpineLogoutService);\n /** \"Saindo…\" no botão; volta a `false` também quando a saída falha. */\n protected readonly logoutPending = this.logoutService.pending;\n\n /** O painel fica aberto até a saída dar certo: com falha, a pessoa continua aqui, com o aviso de erro. */\n protected async logout(): Promise<void> {\n if (await this.logoutService.logout()) this.settings.close();\n }\n\n // ── MFA ─────────────────────────────────────────────────────────────────────\n /** API da conta no Argos (Bearer com o token da sessão), a partir do `AUTH_CONFIG`. Sem ela (sem\n * `authority`/`realmId`, ou com `CHANGE_ME`) a seção MFA e a linha \"Sessões e dispositivos\" não aparecem. */\n protected readonly accountSecurity = inject(SpineAccountSecurityService).available;\n\n /** Login da pessoa (`preferred_username` do token, ou o e-mail), para dizer QUAL conta do Argos. */\n protected get accountLogin(): string {\n const payload = decodeTokenPayload(this.auth.getToken());\n const login = payload?.['preferred_username'] ?? payload?.['email'];\n return typeof login === 'string' ? login : '';\n }\n\n /** Realm pelo nome (`master`, `Minha Empresa`); um id (UUID) não diz nada a quem lê e fica de fora. */\n protected get accountRealm(): string {\n const realm = this.authConfig?.realmId?.trim() ?? '';\n return UUID.test(realm) ? '' : realm;\n }\n\n // ── Sessões ─────────────────────────────────────────────────────────────────\n /** Linhas da seção Sessões, cada uma com a própria condição. \"Tokens de aplicação\" sempre aparece (sem\n * `SPINE_ADMIN_API` os tokens explicam que não estão disponíveis); o token de acesso só com\n * `technicalDocs`; sessões e dispositivos só com a API da conta. A \"Sessão\" (validade) fica em Conta. */\n protected readonly sessionsItems = {\n accessToken: this.showAccessToken,\n appTokens: true,\n aiAgent: !!this.config?.features?.aiAgent?.servers?.length,\n devices: this.accountSecurity,\n } as const;\n /** Sem nenhuma linha visível a seção não aparece. */\n protected readonly hasSessionsSection = Object.values(this.sessionsItems).some(Boolean);\n\n // ── Recursos opcionais (SpineConfig.features) ──────────────────────────────\n private readonly idle = inject(SpineIdleService);\n private readonly startPageService = inject(SpineStartPageService);\n private readonly router = inject(Router);\n protected readonly notices = inject(SpineNoticesService);\n protected readonly accountPreferences = inject(SpineAccountPreferencesService);\n\n /** Conta › \"Encerrar por inatividade\": opções dentro dos limites do app. */\n protected readonly idleOptions = computed<readonly SegmentedOption[]>(() =>\n this.idle.limits.options.map((m) => ({ value: String(m), label: m ? formatMessage(this.featureText.idleOption, { minutes: m }) : this.featureText.idleNever })));\n protected readonly idleValue = computed(() => String(this.idle.minutes()));\n protected readonly idleHint = this.idle.limits.max ? formatMessage(this.featureText.idleLimitHint, { minutes: this.idle.limits.max }) : '';\n\n protected setIdle(value: string): void {\n this.preferences.setIdleMinutes(Number(value));\n }\n\n /** Conta › \"Tela inicial\": início, última tela e cada favorito. */\n protected readonly startPageOptions = computed(() => [\n { value: 'home', label: this.featureText.startHome },\n { value: 'last', label: this.featureText.startLast },\n ...this.quickAccess.favorites().map((f) => ({ value: `fav:${f.id}`, label: formatMessage(this.featureText.startFavorite, { name: f.displayName || f.redirect }) })),\n ]);\n /** Favorito escolhido que deixou de ser favorito: mostra \"Início\" (é para onde o login vai). */\n protected readonly startPageValue = computed(() => {\n const value = this.preferences.startPage();\n return this.startPageOptions().some((o) => o.value === value) ? value : 'home';\n });\n\n protected readonly quickAccessHasFavorites = computed(() => this.quickAccess.favorites().length > 0);\n\n protected setStartPage(value: string): void {\n this.preferences.setStartPage(value as SpineStartPagePreference);\n // \"Última tela visitada\" começa a valer já com a tela de agora.\n if (value === 'last') this.startPageService.remember(this.router.url);\n }\n\n /** Conta › \"Crachá padrão\": só com mais de um crachá nesta aplicação (claim `badges` do token). */\n protected get showDefaultBadge(): boolean {\n return !!this.features.defaultBadge && this.accountSecurity && (this.auth.badges?.length ?? 0) > 1;\n }\n\n /** Notificações: aviso do navegador ligado (escolha + permissão). */\n protected async setBrowserNotices(enabled: boolean): Promise<void> {\n if (!enabled) {\n this.notices.disableBrowser();\n return;\n }\n const ok = await this.notices.enableBrowser();\n if (!ok) this.toast.warning(this.notices.permission() === 'unsupported' ? this.featureText.browserNoticesUnsupported : this.featureText.browserNoticesDenied);\n }\n\n /** \"Preferências na conta\": situação da sincronização. */\n protected readonly syncStatus = computed(() => {\n const status = this.accountPreferences.status();\n const at = this.accountPreferences.syncedAt();\n if (status === 'local') return this.featureText.syncLocal;\n if (status === 'error') return this.featureText.syncError;\n if (status === 'saving' || status === 'loading') return this.featureText.syncSaving;\n if (!at) return '';\n const time = new Intl.DateTimeFormat(this.i18n.formatLocale(), { timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone() }).format(at);\n return formatMessage(this.featureText.syncSynced, { time });\n });\n\n protected syncNow(): void {\n void this.accountPreferences.syncNow();\n }\n\n // ── Sobre ───────────────────────────────────────────────────────────────────\n protected readonly dependencies = KEY_DEPENDENCIES\n .map((d) => ({ ...d, version: this.packageInfo.dependencies?.[d.name] }))\n .filter((d) => !!d.version);\n\n protected get buildDate(): string {\n const date = this.packageInfo.buildDate;\n return date ? new Intl.DateTimeFormat(this.i18n.formatLocale(), { dateStyle: 'short', timeStyle: 'short' }).format(new Date(date)) : '';\n }\n\n /** Texto pronto pra colar num chamado: app, versão, ambiente, navegador, tela, fuso e página. */\n protected async copySupportInfo(): Promise<void> {\n const info = this.packageInfo;\n const s = this.messages.support;\n const theme = formatMessage(s.themeValue, {\n theme: this.appliedTheme(), mode: this.themeMode(), family: this.family(), density: this.densityValue(), font: this.fontValue(),\n });\n const lines = [\n `${s.application}: ${this.appName}${info.name ? ` (${info.name})` : ''}`,\n `${s.version}: ${info.version ?? '—'}`,\n info.buildDate ? `${s.build}: ${this.buildDate}` : '',\n info.environment ? `${s.environment}: ${info.environment}` : '',\n `${s.page}: ${location.href}`,\n `${s.browser}: ${navigator.userAgent}`,\n `${s.screen}: ${window.innerWidth}×${window.innerHeight} @${window.devicePixelRatio}x`,\n `${s.theme}: ${theme}`,\n `${s.timeZone}: ${this.preferences.effectiveTimeZone()}`,\n `${s.accessLevel}: ${this.badge?.name ?? '—'}`,\n `${s.date}: ${new Date().toISOString()}`,\n ].filter(Boolean);\n await this.copy(lines.join('\\n'), this.text.supportCopied);\n }\n\n private async copy(text: string, success: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(text);\n this.toast.success(success);\n } catch {\n this.toast.error(this.text.copyBlocked);\n }\n }\n\n protected onOpenChange(open: boolean): void {\n if (!open) this.settings.close();\n }\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** \"UTC−03:00\" para um fuso IANA. */\nfunction offsetOf(timeZone: string): string {\n try {\n const part = new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'longOffset' })\n .formatToParts(new Date())\n .find((p) => p.type === 'timeZoneName')?.value;\n return (part ?? 'GMT').replace('GMT', 'UTC').replace('-', '−') || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nfunction decodeTokenPayload(token: string | null): Record<string, unknown> | null {\n const payload = token?.split('.')[1];\n if (!payload) return null;\n try {\n const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/').padEnd(Math.ceil(payload.length / 4) * 4, '='));\n return JSON.parse(json) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n","<!-- Montado só enquanto aberto: nada disto (lista de fusos, leitura do token...) custa no\n carregamento de toda página. -->\n@if (settings.isOpen()) {\n <hm-settings-dialog\n [heading]=\"text.heading\"\n [open]=\"true\"\n (openChange)=\"onOpenChange($event)\"\n [activeSection]=\"activeSection()\"\n (activeSectionChange)=\"settings.section.set($event)\"\n >\n <!-- ── Conta ─────────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.account\" [label]=\"text.account\" icon=\"user\" [keywords]=\"text.accountKeywords\">\n <div class=\"sp-settings__profile\">\n <hm-account-avatar [name]=\"profile.name ?? text.user\" [imageUrl]=\"profile.picture\" />\n <span class=\"sp-settings__profile-text\">\n <strong>{{ profile.name ?? text.user }}</strong>\n @if (profile.role) { <span>{{ profile.role }}</span> }\n </span>\n </div>\n\n <!-- Só informativo: a troca de nível fica no menu do perfil, perto de onde se trabalha. -->\n @if (badge) {\n <hm-settings-row [label]=\"text.accessLevel\" [keywords]=\"text.accessLevelKeywords\">\n <span class=\"sp-settings__value\">{{ badge.name }}</span>\n </hm-settings-row>\n }\n\n <hm-settings-row [label]=\"text.session\" [description]=\"text.sessionDescription\" [keywords]=\"text.sessionKeywords\">\n <span class=\"sp-settings__value\">{{ sessionExpiry }}</span>\n </hm-settings-row>\n\n <!-- Recursos opcionais (SpineConfig.features): crachá padrão (Argos), inatividade e tela inicial. -->\n @if (showDefaultBadge) {\n <hm-settings-row [label]=\"featureText.defaultBadge\" [description]=\"featureText.defaultBadgeDescription\" [keywords]=\"featureText.defaultBadgeKeywords\">\n <spine-default-badge />\n </hm-settings-row>\n }\n\n @if (idleOptions().length) {\n <hm-settings-row [label]=\"featureText.idle\" [description]=\"idleHint || featureText.idleDescription\" [keywords]=\"featureText.idleKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"featureText.idle\" [options]=\"idleOptions()\" [value]=\"idleValue()\" (valueChange)=\"setIdle($event)\" />\n </hm-settings-row>\n }\n\n @if (features.startPage) {\n <hm-settings-row [label]=\"featureText.startPage\" [description]=\"quickAccessHasFavorites() ? featureText.startPageDescription : featureText.startPageHint\" [keywords]=\"featureText.startPageKeywords\">\n <hm-select class=\"sp-settings__language\" [label]=\"featureText.startPage\" [labelHidden]=\"true\" [value]=\"startPageValue()\" (valueChange)=\"setStartPage($event ?? 'home')\">\n @for (option of startPageOptions(); track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </hm-select>\n </hm-settings-row>\n }\n\n <hm-settings-row [label]=\"text.logout\" [description]=\"text.logoutDescription\" [keywords]=\"text.logoutKeywords\">\n <hm-button emphasis=\"medium\" intent=\"danger\" icon=\"logout\" [loading]=\"logoutPending()\" (clicked)=\"logout()\">{{ text.logout }}</hm-button>\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── MFA ───────────────────────────────────────────────────────────── -->\n <!-- API da conta do Argos com o token da sessão (Bearer): MFA e códigos de recuperação aqui mesmo, sem\n abrir o Argos. O spineAccountSecurity dá às linhas o mesmo estado (reautenticação, cadastro em\n andamento), que morre quando o painel fecha. `?settings=seguranca` (chave antiga) abre esta seção. -->\n @if (accountSecurity) {\n <hm-settings-section spineAccountSecurity [key]=\"keys.mfa\" [label]=\"text.mfa\" icon=\"shield-check\" [description]=\"text.mfaDescription\" [keywords]=\"text.mfaKeywords\">\n <!-- Realm só pelo nome: o id (UUID) não diz nada a quem lê, então some. -->\n @if (accountLogin || accountRealm) {\n <hm-settings-row [label]=\"text.signedInAccount\" [description]=\"accountRealm ? fmt(text.signedInRealm, { realm: accountRealm }) : ''\">\n <span class=\"sp-settings__value\">{{ profile.name ?? text.user }}@if (accountLogin) { <span class=\"sp-settings__muted\"> · {{ accountLogin }}</span> }</span>\n </hm-settings-row>\n }\n\n <hm-settings-row [label]=\"text.twoFactor\" [description]=\"text.twoFactorDescription\" [keywords]=\"text.twoFactorKeywords\" [stacked]=\"true\">\n <spine-account-mfa />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.recoveryCodes\" [description]=\"text.recoveryCodesDescription\" [keywords]=\"text.recoveryCodesKeywords\" [stacked]=\"true\">\n <spine-account-recovery-codes />\n </hm-settings-row>\n\n <!-- Entradas e tentativas desta conta (SpineFeatures.accountActivity), últimos 90 dias. -->\n @if (features.accountActivity) {\n <hm-settings-row [label]=\"featureText.activity\" [description]=\"featureText.activityDescription\" [keywords]=\"featureText.activityKeywords\" [stacked]=\"true\">\n <spine-account-activity />\n </hm-settings-row>\n }\n </hm-settings-section>\n }\n\n <!-- ── Sessões ───────────────────────────────────────────────────────── -->\n <!-- Os tokens e onde a conta está conectada (a validade desta sessão fica em Conta). Cada linha tem a\n própria condição; a seção some se nenhuma sobrar (hasSessionsSection). -->\n @if (hasSessionsSection) {\n <hm-settings-section [key]=\"keys.sessions\" [label]=\"text.sessionsSection\" icon=\"devices\" [description]=\"text.sessionsSectionDescription\" [keywords]=\"text.sessionsSectionKeywords\">\n <!-- Só com SpineConfig.technicalDocs (padrão: isDevMode()): token da sessão no clipboard é ferramenta de dev. -->\n @if (sessionsItems.accessToken) {\n <hm-settings-row [label]=\"text.accessToken\" [description]=\"text.accessTokenDescription\" [keywords]=\"text.accessTokenKeywords\">\n <hm-button emphasis=\"medium\" icon=\"copy\" (clicked)=\"copyToken()\">{{ text.copy }}</hm-button>\n </hm-settings-row>\n }\n\n @if (sessionsItems.appTokens) {\n <hm-settings-row [label]=\"text.appTokens\" [stacked]=\"true\"\n [description]=\"text.appTokensDescription\"\n [keywords]=\"text.appTokensKeywords\">\n <hm-toggletip rowHelp [label]=\"fmt(text.moreAbout, { label: text.appTokens })\" [text]=\"text.appTokensHelp\" />\n <spine-app-tokens />\n </hm-settings-row>\n }\n\n <!-- Token + .mcp.json prontos para um agente de IA (SpineFeatures.aiAgent). -->\n @if (sessionsItems.aiAgent) {\n <hm-settings-row [label]=\"featureText.aiAgent\" [description]=\"featureText.aiAgentDescription\" [keywords]=\"featureText.aiAgentKeywords\" [stacked]=\"true\">\n <hm-toggletip rowHelp [label]=\"fmt(text.moreAbout, { label: featureText.aiAgent })\" [text]=\"featureText.aiAgentHelp\" />\n <spine-ai-agent />\n </hm-settings-row>\n }\n\n <!-- Sessões e dispositivos: API da conta do Argos, mesma condição da seção MFA. -->\n @if (sessionsItems.devices) {\n <hm-settings-row [label]=\"text.sessions\" [description]=\"text.sessionsDescription\" [keywords]=\"text.sessionsKeywords\" [stacked]=\"true\">\n <spine-account-sessions />\n </hm-settings-row>\n }\n </hm-settings-section>\n }\n\n <!-- ── Aparência ─────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.appearance\" [label]=\"text.appearance\" icon=\"color-palette\" [keywords]=\"text.appearanceKeywords\">\n <hm-settings-row [label]=\"text.theme\" [description]=\"text.themeDescription\" [keywords]=\"text.themeKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.theme\" [options]=\"themeOptions()\" [value]=\"themeMode()\" (valueChange)=\"setThemeMode($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.accent\" [description]=\"text.accentDescription\" [keywords]=\"text.accentKeywords\" [stacked]=\"true\">\n <hm-theme-picker\n class=\"sp-settings__picker\"\n [families]=\"families\"\n [family]=\"family()\"\n [theme]=\"appliedTheme()\"\n [showMode]=\"false\"\n (familyChosen)=\"setFamily($event)\"\n />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.density\" [description]=\"text.densityDescription\" [keywords]=\"text.densityKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.density\" [options]=\"densityOptions()\" [value]=\"densityValue()\" (valueChange)=\"setDensity($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.font\" [description]=\"text.fontDescription\" [keywords]=\"text.fontKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.font\" [options]=\"fontOptions\" [value]=\"fontValue()\" (valueChange)=\"setFont($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.sidebar\" [description]=\"text.sidebarDescription\" [keywords]=\"text.sidebarKeywords\">\n <hm-toggletip rowHelp [label]=\"fmt(text.moreAbout, { label: text.sidebar })\" [text]=\"text.sidebarHelp\" />\n <hm-segmented-control emphasis=\"action\" [label]=\"text.sidebar\" [options]=\"sidebarOptions()\" [value]=\"sidebar.mode()\" (valueChange)=\"setSidebarMode($event)\" />\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Acessibilidade ────────────────────────────────────────────────── -->\n <!-- Tamanho do texto (--hm-text-scale no <html>, HermesZoomService) e movimento (data-motion no <html>,\n HermesMotionService), guardados pelo SpinePreferencesService. -->\n <hm-settings-section [key]=\"keys.accessibility\" [label]=\"text.accessibility\" icon=\"accessibility-1\" [keywords]=\"text.accessibilityKeywords\">\n <hm-settings-row [label]=\"text.textSize\" [description]=\"text.textSizeDescription\" [keywords]=\"text.textSizeKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.textSize\" [options]=\"textSizeOptions()\" [value]=\"textSizeValue()\" (valueChange)=\"setTextSize($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.motion\" [description]=\"text.motionDescription\" [keywords]=\"text.motionKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.motion\" [options]=\"motionOptions()\" [value]=\"preferences.motion()\" (valueChange)=\"setMotion($event)\" />\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Região ────────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.region\" [label]=\"text.region\" icon=\"clock\" [keywords]=\"text.regionKeywords\">\n <hm-settings-row [label]=\"text.language\" [description]=\"text.languageDescription\" [keywords]=\"text.languageKeywords\">\n <hm-select\n class=\"sp-settings__language\"\n [label]=\"text.language\"\n [labelHidden]=\"true\"\n [value]=\"preferences.language()\"\n (valueChange)=\"preferences.setLanguage($event ?? '')\"\n >\n @for (option of languageOptions(); track option.value) {\n <option [value]=\"option.value\" [attr.lang]=\"option.value || null\">{{ option.label }}</option>\n }\n </hm-select>\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.timeZone\" [description]=\"fmt(text.timeZoneHint, { now: timeZonePreview() })\" [keywords]=\"text.timeZoneKeywords\">\n <hm-combobox\n class=\"sp-settings__timezone\"\n [label]=\"text.timeZone\"\n [labelHidden]=\"true\"\n icon=\"world\"\n [options]=\"timeZoneOptions()\"\n [value]=\"preferences.timeZone()\"\n (valueChange)=\"preferences.setTimeZone($event)\"\n />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.hourCycle\" [description]=\"fmt(text.hourCycleHint, { now: hourCyclePreview() })\" [keywords]=\"text.hourCycleKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.hourCycle\" [options]=\"hourCycleOptions()\" [value]=\"preferences.hourCycle()\" (valueChange)=\"setHourCycle($event)\" />\n </hm-settings-row>\n\n <hm-settings-row [label]=\"text.weekStart\" [description]=\"text.weekStartDescription\" [keywords]=\"text.weekStartKeywords\">\n <hm-segmented-control emphasis=\"action\" [label]=\"text.weekStart\" [options]=\"weekStartOptions()\" [value]=\"weekStartValue()\" (valueChange)=\"setWeekStart($event)\" />\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Notificações (SpineFeatures.notices) ──────────────────────────── -->\n <!-- Os tipos de aviso que o app declarou (SpineNoticesService) e o aviso do navegador com a aba em segundo plano. -->\n @if (notices.enabled) {\n <hm-settings-section [key]=\"keys.notices\" [label]=\"featureText.notices\" icon=\"bell\" [description]=\"featureText.noticesDescription\" [keywords]=\"featureText.noticesKeywords\">\n @for (type of notices.types; track type.id) {\n <hm-settings-row [label]=\"type.label\" [description]=\"type.description ?? ''\">\n <hm-checkbox [label]=\"type.label\" [labelHidden]=\"true\" [checked]=\"notices.isEnabled(type.id)\" (checkedChange)=\"notices.setEnabled(type.id, $event)\" />\n </hm-settings-row>\n }\n <hm-settings-row [label]=\"featureText.browserNotices\" [description]=\"notices.permission() === 'denied' ? featureText.browserNoticesDenied : notices.permission() === 'unsupported' ? featureText.browserNoticesUnsupported : featureText.browserNoticesDescription\">\n <hm-checkbox [label]=\"featureText.browserNotices\" [labelHidden]=\"true\" [checked]=\"notices.browserActive()\" (checkedChange)=\"setBrowserNotices($event)\" />\n </hm-settings-row>\n </hm-settings-section>\n }\n\n <!-- ── Atalhos ───────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.shortcuts\" [label]=\"text.shortcuts\" icon=\"keyboard\" [description]=\"text.shortcutsDescription\" [keywords]=\"text.shortcutsKeywords\">\n <!-- Mesma lista do painel \"?\", sem busca (a do diálogo de configurações já cobre a seção);\n o interruptor de tecla única (WCAG 2.1.4) persiste no SpinePreferencesService. -->\n <hm-shortcut-list class=\"sp-settings__shortcuts\" characterKeysToggle [registered]=\"false\" [items]=\"shortcutItems()\" [headingLevel]=\"4\" />\n </hm-settings-section>\n\n <!-- ── Dados do navegador ────────────────────────────────────────────── -->\n <!-- Listas por usuário do SpineUserStorage e as preferências deste painel. Destrutivo: o 1º clique pede\n confirmação (botão vira \"Confirmar\" + Cancelar), como nas listas de tokens e sessões. -->\n <hm-settings-section [key]=\"keys.data\" [label]=\"text.browserData\" icon=\"browser-setting\" [description]=\"text.browserDataDescription\" [keywords]=\"text.browserDataKeywords\">\n <!-- SpineFeatures.accountPreferences: as preferências também na conta do Argos (as telas acima não mudam). -->\n @if (features.accountPreferences) {\n <hm-settings-row [label]=\"featureText.sync\" [description]=\"syncStatus() || featureText.syncDescription\" [keywords]=\"featureText.syncKeywords\">\n <hm-toggletip rowHelp [label]=\"fmt(text.moreAbout, { label: featureText.sync })\" [text]=\"featureText.syncDescription\" />\n <hm-button emphasis=\"medium\" icon=\"refresh\" [disabled]=\"accountPreferences.status() === 'local'\" [loading]=\"accountPreferences.status() === 'saving' || accountPreferences.status() === 'loading'\" (clicked)=\"syncNow()\">{{ featureText.syncNow }}</hm-button>\n </hm-settings-row>\n }\n @for (list of browserLists(); track list.id) {\n <hm-settings-row [label]=\"list.label\" [description]=\"list.count\" [keywords]=\"list.keywords\">\n <span class=\"sp-settings__actions\">\n @if (confirming() === list.id) {\n <hm-button emphasis=\"medium\" (clicked)=\"cancelConfirm()\">{{ text.cancel }}</hm-button>\n }\n <hm-button\n [emphasis]=\"confirming() === list.id ? 'high' : 'medium'\"\n intent=\"danger\"\n [disabled]=\"list.empty && confirming() !== list.id\"\n (clicked)=\"clearList(list.id)\"\n >{{ confirming() === list.id ? text.confirmClear : text.clear }}</hm-button>\n </span>\n </hm-settings-row>\n }\n\n <hm-settings-row [label]=\"text.restorePreferences\" [description]=\"text.restorePreferencesDescription\" [keywords]=\"text.restorePreferencesKeywords\">\n <hm-toggletip rowHelp [label]=\"fmt(text.moreAbout, { label: text.restorePreferences })\" [text]=\"text.restorePreferencesHelp\" />\n <span class=\"sp-settings__actions\">\n @if (confirming() === 'preferences') {\n <hm-button emphasis=\"medium\" (clicked)=\"cancelConfirm()\">{{ text.cancel }}</hm-button>\n }\n <hm-button [emphasis]=\"confirming() === 'preferences' ? 'high' : 'medium'\" intent=\"danger\" (clicked)=\"restorePreferences()\">\n {{ confirming() === 'preferences' ? text.confirmRestore : text.restore }}\n </hm-button>\n </span>\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Ajuda ─────────────────────────────────────────────────────────── -->\n <!-- Novidades (só com alguma vigente) e tour: os dois fecham o painel, que ocupa a tela. -->\n <hm-settings-section [key]=\"keys.help\" [label]=\"text.help\" icon=\"help\" [keywords]=\"text.helpKeywords\">\n @if (hasNews()) {\n <hm-settings-row [label]=\"text.news\" [description]=\"text.newsDescription\" [keywords]=\"text.newsKeywords\">\n <hm-button emphasis=\"medium\" icon=\"star\" (clicked)=\"showNews()\">{{ text.showNews }}</hm-button>\n </hm-settings-row>\n }\n <hm-settings-row [label]=\"text.tour\" [description]=\"text.tourDescription\" [keywords]=\"text.tourKeywords\">\n <hm-button emphasis=\"medium\" icon=\"play\" (clicked)=\"replayTour()\">{{ text.replayTour }}</hm-button>\n </hm-settings-row>\n </hm-settings-section>\n\n <!-- ── Seções do app (provideSettingsSection) ────────────────────────── -->\n @for (s of appSections; track s.key) {\n <hm-settings-section [key]=\"s.key\" [label]=\"s.label\" [icon]=\"s.icon ?? 'cog'\" [description]=\"s.description ?? ''\" [keywords]=\"s.keywords ?? ''\">\n <ng-container *ngComponentOutlet=\"s.component\" />\n </hm-settings-section>\n }\n\n <!-- ── Sobre ─────────────────────────────────────────────────────────── -->\n <hm-settings-section [key]=\"keys.about\" [label]=\"text.about\" icon=\"info-circle\" [keywords]=\"text.aboutKeywords\">\n <hm-settings-row [label]=\"text.application\">\n <span class=\"sp-settings__value\">{{ appName }}@if (packageInfo.name) { <span class=\"sp-settings__muted\"> · {{ packageInfo.name }}</span> }</span>\n </hm-settings-row>\n <hm-settings-row [label]=\"text.version\" [keywords]=\"text.versionKeywords\">\n <span class=\"sp-settings__value sp-settings__mono\">{{ packageInfo.version ?? '—' }}</span>\n </hm-settings-row>\n @if (buildDate) {\n <hm-settings-row [label]=\"text.buildDate\">\n <span class=\"sp-settings__value\">{{ buildDate }}</span>\n </hm-settings-row>\n }\n @if (packageInfo.environment) {\n <hm-settings-row [label]=\"text.environment\" [keywords]=\"text.environmentKeywords\">\n <span class=\"sp-settings__value\">{{ packageInfo.environment }}</span>\n </hm-settings-row>\n }\n @if (packageInfo.repository?.url || packageInfo.docs || packageInfo.issues) {\n <hm-settings-row [label]=\"text.links\" [keywords]=\"text.linksKeywords\">\n <span class=\"sp-settings__links\">\n @if (packageInfo.docs) { <hm-button emphasis=\"medium\" icon=\"book\" [link]=\"packageInfo.docs\" [newTab]=\"true\">{{ text.docs }}</hm-button> }\n @if (packageInfo.issues) { <hm-button emphasis=\"medium\" icon=\"bug\" [link]=\"packageInfo.issues\" [newTab]=\"true\">{{ text.reportIssue }}</hm-button> }\n @if (packageInfo.repository?.url) { <hm-button emphasis=\"medium\" icon=\"link\" [link]=\"packageInfo.repository!.url!\" [newTab]=\"true\">{{ text.repository }}</hm-button> }\n </span>\n </hm-settings-row>\n }\n @if (dependencies.length) {\n <hm-settings-row [label]=\"text.dependencies\" [description]=\"text.dependenciesDescription\" [keywords]=\"text.dependenciesKeywords\" [stacked]=\"true\">\n <dl class=\"sp-settings__deps\">\n @for (d of dependencies; track d.name) {\n <div><dt>{{ d.label }}</dt><dd class=\"sp-settings__mono\">{{ d.version }}</dd></div>\n }\n </dl>\n </hm-settings-row>\n }\n <hm-settings-row [label]=\"text.supportInfo\" [description]=\"text.supportInfoDescription\" [keywords]=\"text.supportInfoKeywords\">\n <hm-button emphasis=\"medium\" icon=\"clipboard\" (clicked)=\"copySupportInfo()\">{{ text.copy }}</hm-button>\n </hm-settings-row>\n </hm-settings-section>\n </hm-settings-dialog>\n}\n","import { DestroyRef, Injectable, computed, inject, isDevMode, signal } from '@angular/core';\nimport { ViewService } from '@orfeu/angular/core';\nimport { Route, SPINE_CONFIG, SPINE_MESSAGES, routerIdOf, spineRoutesOf } from '@trismegisto/spine';\nimport { ComponentDistributorService, RouteDocument, componentRouterId } from '@trismegisto/spine/routing';\n\n/** Documento de uma tela que a pessoa logada pode abrir. */\nexport interface DocsEntry extends RouteDocument {\n /** Chave da tela (router_id ou, sem ele, o do template), sempre em minúsculas. */\n readonly id: string;\n readonly title: string;\n readonly group: string;\n}\n\nexport interface DocsGroup {\n readonly title: string;\n readonly entries: readonly DocsEntry[];\n}\n\nexport type DocsView = 'usage' | 'technical';\n\ninterface ScreenInfo {\n readonly label: string;\n readonly module: string;\n}\n\n/**\n * Estado da documentação das telas: o que está registrado em `COMPONENT_ROUTES` com `document`,\n * filtrado pelas telas que existem na árvore da pessoa (documento de tela sem acesso nunca é oferecido),\n * e a leitura em andamento no modal `spine-docs`.\n */\n@Injectable({ providedIn: 'root' })\nexport class SpineDocsService {\n readonly #distributor = inject(ComponentDistributorService);\n readonly #views = inject(ViewService);\n readonly #messages = inject(SPINE_MESSAGES);\n\n /** Visão técnica liberada (`SpineConfig.technicalDocs`; sem configuração, só em desenvolvimento). */\n readonly technicalAvailable: boolean = inject(SPINE_CONFIG, { optional: true })?.technicalDocs ?? isDevMode();\n\n readonly #isOpen = signal(false);\n readonly #current = signal<DocsEntry | null>(null);\n readonly #view = signal<DocsView>('usage');\n readonly #content = signal('');\n readonly #loading = signal(false);\n readonly #failed = signal(false);\n /** Identifica a leitura vigente; respostas de leituras anteriores são ignoradas. */\n #ticket = 0;\n /** A view do Orfeu não é um signal: este contador força a releitura da árvore. */\n readonly #treeRevision = signal(0);\n\n readonly isOpen = this.#isOpen.asReadonly();\n readonly current = this.#current.asReadonly();\n readonly view = this.#view.asReadonly();\n readonly content = this.#content.asReadonly();\n readonly loading = this.#loading.asReadonly();\n readonly error = computed(() => (this.#failed() ? this.#messages.docs.loadError : ''));\n readonly showTechnical = computed(\n () => this.technicalAvailable && !!this.#current()?.loadTechnical,\n );\n\n readonly #offered = computed<ReadonlyMap<string, DocsEntry>>(() => {\n this.#treeRevision();\n const screens = this.#screens();\n const offered = new Map<string, DocsEntry>();\n for (const registered of this.#distributor.entries) {\n const document = registered.document;\n if (!document) continue;\n const key = (componentRouterId(registered) ?? registered.source_template_router_id)?.toLowerCase();\n if (!key || offered.has(key)) continue;\n const screen = screens.get(key);\n if (!screen) continue;\n offered.set(key, {\n ...document,\n id: key,\n title: document.title ?? screen.label,\n group: document.group ?? screen.module,\n });\n }\n return offered;\n });\n\n readonly index = computed<DocsGroup[]>(() => {\n const locale = this.#messages.meta.locale;\n const compare = (a: string, b: string) => a.localeCompare(b, locale);\n const byGroup = new Map<string, DocsEntry[]>();\n for (const entry of this.#offered().values()) {\n const list = byGroup.get(entry.group);\n if (list) list.push(entry);\n else byGroup.set(entry.group, [entry]);\n }\n return [...byGroup]\n .map(([title, entries]) => ({ title, entries: entries.sort((a, b) => compare(a.title, b.title)) }))\n .sort((a, b) => compare(a.title, b.title));\n });\n\n constructor() {\n // Quando a view muda (login, troca de crachá), o botão da barra da página acompanha sem esperar\n // a próxima abertura.\n const changes = (this.#views as Partial<Pick<ViewService, 'currentView$'>>).currentView$;\n // A emissão síncrona da inscrição é a view que o `#offered` já lê; só as seguintes importam.\n let subscribed = false;\n const subscription = changes?.subscribe?.(() => {\n if (subscribed) this.#refreshTree();\n });\n subscribed = true;\n if (subscription) inject(DestroyRef).onDestroy(() => subscription.unsubscribe());\n }\n\n documentFor(routerId: string | null | undefined, sourceTemplateRouterId?: string | null): DocsEntry | null {\n const offered = this.#offered();\n for (const candidate of [routerId, sourceTemplateRouterId]) {\n if (!candidate) continue;\n const entry = offered.get(candidate.toLowerCase());\n if (entry) return entry;\n }\n return null;\n }\n\n openForRoute(routerId: string | null | undefined, sourceTemplateRouterId?: string | null): void {\n this.#refreshTree();\n this.#isOpen.set(true);\n const entry = this.documentFor(routerId, sourceTemplateRouterId);\n if (entry) void this.open(entry);\n }\n\n openIndex(): void {\n this.#refreshTree();\n this.#isOpen.set(true);\n }\n\n close(): void {\n this.#isOpen.set(false);\n }\n\n open(entry: DocsEntry, view: DocsView = 'usage'): Promise<void> {\n this.#current.set(entry);\n return this.show(view);\n }\n\n async show(view: DocsView): Promise<void> {\n const entry = this.#current();\n if (!entry) return;\n const technical = view === 'technical' && this.technicalAvailable ? entry.loadTechnical : undefined;\n const ticket = ++this.#ticket;\n\n this.#view.set(technical ? 'technical' : 'usage');\n this.#loading.set(true);\n this.#failed.set(false);\n\n let text = '';\n let failed = false;\n try {\n text = await (technical ?? entry.load)();\n } catch {\n failed = true;\n }\n if (ticket !== this.#ticket) return;\n\n this.#content.set(failed ? '' : text);\n this.#failed.set(failed);\n this.#loading.set(false);\n }\n\n #refreshTree(): void {\n this.#treeRevision.update((n) => n + 1);\n }\n\n /** Telas da árvore da pessoa, por router_id e por template, com rótulo e módulo de topo. */\n #screens(): Map<string, ScreenInfo> {\n const screens = new Map<string, ScreenInfo>();\n const visit = (node: Route, module: string) => {\n const info: ScreenInfo = { label: node.route_display_name ?? '', module };\n for (const key of [routerIdOf(node), node.source_template_router_id]) {\n if (key && !screens.has(key.toLowerCase())) screens.set(key.toLowerCase(), info);\n }\n for (const child of node.routes ?? []) visit(child, module);\n };\n for (const root of spineRoutesOf(this.#views.currentView)) visit(root, root.route_display_name ?? '');\n return screens;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal } from '@angular/core';\nimport { BreadcrumbComponent, BreadcrumbItem, IconButtonComponent, IconComponent, TooltipDirective } from '@trismegisto/angular';\nimport { QuickAccessItem, Route, routerIdOf, SpineQuickAccessService, SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineDocsService } from '../docs/docs.service';\n\n/**\n * Barra de contexto do topo de CADA painel do workspace: título e ícone da página e as\n * ações que valem pra página inteira (favoritar, copiar link, documentação) em cima; a descrição da\n * tela logo abaixo do título; a trilha (breadcrumb) embaixo.\n *\n * A descrição é do ROUTER (`web.router.description`, editada no Argos), não da tela: é aqui que todo\n * app mostra \"o que esta página faz\", então as telas NÃO repetem título+descrição internos.\n * Tela identificada pelo `router_id` do nó 'page' (`routerIdOf`), nunca pelo `web.routes.route_id`.\n *\n * Mora dentro do painel (não num shell global) porque cada painel do `hm-workspace` resolve a\n * própria aba: dois painéis lado a lado mostram duas trilhas diferentes ao mesmo tempo. Por isso\n * recebe a `chain` (header→…→page) do painel em vez de ler a \"página atual\" de algum serviço global.\n *\n * Só o painel focado alimenta os \"recentes\" (`recordRecent`) — os outros apenas exibem.\n *\n * Favoritos e recentes moram no `SpineQuickAccessService` (compartilhado com a tela inicial): o\n * coração daqui e a seção \"Favoritos\" do Início mudam juntos.\n */\n@Component({\n selector: 'spine-page-bar',\n imports: [BreadcrumbComponent, IconComponent, IconButtonComponent, TooltipDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (title(); as pageTitle) {\n <header class=\"spine-page-bar\" data-tour=\"breadcrumb\">\n <div class=\"spine-page-bar__identity\">\n <div class=\"spine-page-bar__title-row\">\n @if (icon(); as ic) {\n <hm-icon class=\"spine-page-bar__icon\" [shape]=\"ic\" />\n }\n <h1 class=\"spine-page-bar__title\">{{ pageTitle }}</h1>\n\n <span class=\"spine-page-bar__actions\">\n <!-- O estado vai no nome (\"Favoritar\" / \"Remover dos favoritos\"). Sem aria-pressed: no host\n <hm-icon-button> ele caía num elemento sem papel, e não no <button> (o leitor não lia).\n A dica (hmTooltip) repete o nome para quem enxerga: só ícone, sem texto, o botão não diz\n o que faz até ser clicado. -->\n <hm-icon-button\n emphasis=\"subtle\"\n icon=\"heart\" [solid]=\"isFavorite()\"\n [label]=\"isFavorite() ? text.unfavorite : text.favorite\"\n [hmTooltip]=\"isFavorite() ? text.unfavorite : text.favorite\"\n [class.spine-page-bar__fav--on]=\"isFavorite()\"\n (clicked)=\"toggleFavorite()\"\n />\n <hm-icon-button\n emphasis=\"subtle\"\n [icon]=\"linkCopied() ? 'check' : 'copy'\"\n [label]=\"linkCopied() ? text.linkCopied : text.copyLink\"\n [hmTooltip]=\"linkCopied() ? text.linkCopied : text.copyLink\"\n (clicked)=\"copyLink()\"\n />\n <!-- Só quando a tela tem documento registrado (\\`document\\` no mapa de componentes). -->\n @if (hasDoc()) {\n <hm-icon-button emphasis=\"subtle\" icon=\"doc-list\" [label]=\"text.docs\" [hmTooltip]=\"text.docs\" (clicked)=\"openDocs()\" />\n }\n </span>\n </div>\n\n @if (description(); as desc) {\n <p class=\"spine-page-bar__description\">{{ desc }}</p>\n }\n\n <!-- Trilha: o hm-breadcrumb da lib (nav nomeado, lista ordenada, aria-current no último degrau,\n recolhe o meio de trilha longa). Só com mais de um nível — numa página de nível 1 a trilha\n repetiria o título. -->\n @if (crumbs().length > 1) {\n <hm-breadcrumb class=\"spine-page-bar__trail\" [items]=\"trail()\" [label]=\"text.trail\" />\n }\n </div>\n\n <!-- Conteúdo projetado pela tela (botões dela). -->\n <div class=\"spine-page-bar__extra\"><ng-content /></div>\n </header>\n }\n `,\n styles: [`\n :host { display: block; }\n .spine-page-bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--hm-space-sm);\n padding: var(--hm-space-sm) var(--hm-space-md);\n margin: 0;\n /* Faixa própria: fundo elevado e uma linha embaixo separam a barra do conteúdo da página. */\n background: var(--hm-surface-raised);\n border-block-end: var(--hm-border-hairline, 1px) solid var(--hm-divider);\n }\n /* Cresce para a trilha ter a largura da barra (e recolher/truncar nela), sem empurrar as ações extras.\n Entre o nome da página e a trilha: --hm-space-md até o TEXTO da trilha (com menos as linhas liam como um bloco\n só) — o respiro interno de cada degrau do hm-breadcrumb (--hm-space-micro) já conta nessa distância. */\n .spine-page-bar__identity {\n display: flex;\n flex: 1 1 auto;\n min-inline-size: 0;\n flex-direction: column;\n gap: calc(var(--hm-space-md) - var(--hm-space-micro));\n }\n .spine-page-bar__title-row { display: flex; align-items: center; gap: var(--hm-space-xs); min-inline-size: 0; }\n .spine-page-bar__icon { flex: none; color: var(--hm-accent); font-size: var(--hm-font-size-xxl, 28px); }\n .spine-page-bar__title {\n min-inline-size: 0;\n margin: 0;\n overflow: hidden;\n color: var(--hm-text);\n font-size: var(--hm-font-size-xl, 22px);\n font-weight: var(--hm-font-weight-bold, 700);\n line-height: var(--hm-line-height-tight, 1.2);\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n /* Colada no título (desconta o gap da coluna, que é o respiro título→trilha): fica --hm-space-nano\n abaixo dele. Texto secundário, quebra em mais linhas sem truncar. */\n .spine-page-bar__description {\n max-inline-size: 80ch;\n margin: calc(var(--hm-space-nano) - (var(--hm-space-md) - var(--hm-space-micro))) 0 0;\n color: var(--hm-muted);\n font-size: var(--hm-font-size-sm, 14px);\n line-height: var(--hm-line-height-normal, 1.5);\n }\n .spine-page-bar__actions { display: inline-flex; flex: none; align-items: center; gap: var(--hm-space-micro); margin-inline-start: var(--hm-space-nano); }\n /* Favorito ativo: ícone preenchido em --hm-danger (o mesmo tratamento da tela inicial). */\n .spine-page-bar__fav--on { color: var(--hm-danger); }\n /* Trilha = hm-breadcrumb (visual do @trismegisto/core: degrau clicável na cor de ação, o atual em texto\n secundário, separador em ângulo). Cada degrau tem um respiro interno (alvo de foco/hover); a margem\n negativa do mesmo tamanho alinha o texto do primeiro degrau com o título, em qualquer densidade. */\n .spine-page-bar__trail { margin-inline-start: calc(-1 * var(--hm-space-micro)); margin-block-end: calc(-1 * var(--hm-space-micro)); }\n .spine-page-bar__extra { display: flex; flex: none; align-items: center; gap: var(--hm-space-xxxs); }\n .spine-page-bar__extra:empty { display: none; }\n `],\n})\nexport class SpinePageBarComponent {\n protected readonly text = inject(SPINE_MESSAGES).pageBar;\n /** Cadeia resolvida (header→…→page) do painel; `null` enquanto a URL não resolve. */\n readonly chain = input<Route[] | null>(null);\n /** Só o painel focado registra a página em \"recentes\". */\n readonly recordRecent = input(false);\n\n protected readonly linkCopied = signal(false);\n private readonly docs = inject(SpineDocsService);\n\n /** A página (último nó da cadeia). */\n private readonly page = computed(() => this.chain()?.at(-1) ?? null);\n /** router_id da página -- chave do documento dela (o router do template entra como alternativa). */\n private readonly routerId = computed(() => routerIdOf(this.page()));\n private readonly sourceTemplateRouterId = computed(() => this.page()?.source_template_router_id ?? null);\n protected readonly hasDoc = computed(() => !!this.docs.documentFor(this.routerId(), this.sourceTemplateRouterId()));\n\n /** Descrição do router da página (`web.router.description`); vazia = sem a linha. */\n protected readonly description = computed(() => this.page()?.description?.trim() || '');\n\n protected openDocs(): void {\n this.docs.openForRoute(this.routerId(), this.sourceTemplateRouterId());\n }\n\n private readonly quickAccess = inject(SpineQuickAccessService);\n\n constructor() {\n effect(() => {\n const item = this.currentItem();\n if (this.recordRecent() && item) this.quickAccess.recordVisit(item);\n });\n }\n\n protected readonly crumbs = computed<{ label: string; link: string }[]>(() =>\n (this.chain() ?? [])\n .filter((r): r is Route & { route_display_name: string } => !!r.route_display_name)\n .map((r) => ({ label: r.route_display_name, link: r.route_redirect ?? '' })),\n );\n\n /** Degraus do `hm-breadcrumb`: nível sem endereço (grupo) vira texto, sem link. */\n protected readonly trail = computed<BreadcrumbItem[]>(() =>\n this.crumbs().map(({ label, link }) => (link ? { label, routerLink: link } : { label })),\n );\n\n protected readonly title = computed<string>(() => this.crumbs().at(-1)?.label ?? '');\n\n /** Ícone da própria página; cai no do módulo quando a página não tem. */\n protected readonly icon = computed<string | null>(() => {\n const chain = this.chain() ?? [];\n return chain.at(-1)?.route_icon || chain[0]?.route_icon || null;\n });\n\n /** A página do painel como item de favorito/recente, com a trilha (\"onde fica\") dela. */\n private readonly currentItem = computed<QuickAccessItem | null>(() => {\n const crumbs = this.crumbs();\n const last = crumbs.at(-1);\n if (!last?.link) return null;\n return {\n id: last.link,\n icon: this.icon() || 'application',\n displayName: last.label,\n redirect: last.link,\n trail: crumbs.slice(0, -1).map((c) => c.label),\n };\n });\n\n protected readonly isFavorite = computed(() => this.quickAccess.isFavorite(this.currentItem()?.id));\n\n protected toggleFavorite(): void {\n const item = this.currentItem();\n if (item) this.quickAccess.toggleFavorite(item);\n }\n\n protected copyLink(): void {\n try {\n void navigator.clipboard?.writeText(window.location.href);\n this.linkCopied.set(true);\n setTimeout(() => this.linkCopied.set(false), 2000);\n } catch {\n /* clipboard indisponível */\n }\n }\n\n}\n","import { NgComponentOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Type, effect, inject, input, signal } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { ViewService } from '@orfeu/angular/core';\nimport { IconComponent, LoadingSquareComponent } from '@trismegisto/angular';\nimport { Route, routerIdOf, SPINE_MESSAGES, spineRoutesOf } from '@trismegisto/spine';\nimport { ComponentDistributorService, LoggerService, resolveEffectiveRouteChain } from '@trismegisto/spine/routing';\nimport { SpinePageBarComponent } from './spine-page-bar.component';\n\n// Componente já carregado para cada url, comum a todos os painéis: reabrir a mesma tela em outro\n// painel (ou voltar a ela) não passa de novo pelo distribuidor.\nconst componentCache = new Map<string, Type<unknown>>();\n\n/**\n * Conteúdo de um painel do `hm-workspace`. Como vários painéis ficam visíveis ao mesmo tempo, cada\n * um monta a sua tela a partir da própria `url`, sem `<router-outlet>`: o roteador só conhece uma\n * rota ativa, e aqui cada painel precisa manter a sua.\n *\n * Mostra o quadrado de carregamento enquanto o componente chega, a tela quando ele chega, ou o\n * aviso de \"não encontrado\" quando a url não leva a nenhuma rota com tela.\n */\n@Component({\n selector: 'spine-page-panel',\n imports: [NgComponentOutlet, LoadingSquareComponent, IconComponent, SpinePageBarComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <spine-page-bar [chain]=\"chain()\" [recordRecent]=\"isFocusedPanel()\" />\n <div class=\"spine-page-panel__content\">\n @if (loading()) {\n <div class=\"spine-page-panel__loading\"><hm-loading-square /></div>\n } @else if (component(); as cmp) {\n <ng-container [ngComponentOutlet]=\"cmp\" />\n } @else {\n <div class=\"spine-page-panel__empty\">\n <hm-icon shape=\"search-magnify\" size=\"xl\" />\n <p class=\"spine-page-panel__empty-title\">{{ text.notFoundTitle }}</p>\n <p class=\"spine-page-panel__empty-description\">{{ text.notFoundText }}</p>\n </div>\n }\n </div>\n `,\n styles: [`\n :host { display: flex; flex-direction: column; block-size: 100%; min-block-size: 0; }\n .spine-page-panel__content { flex: 1; min-block-size: 0; display: flex; flex-direction: column; padding: var(--hm-space-lg, 1.5rem) var(--hm-space-md, 1rem); }\n .spine-page-panel__loading { display: flex; flex: 1; align-items: center; justify-content: center; min-block-size: 50vh; padding: var(--hm-space-xl); }\n .spine-page-panel__empty {\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--hm-space-sm);\n padding: var(--hm-space-xl);\n text-align: center;\n color: var(--hm-muted);\n }\n .spine-page-panel__empty hm-icon { color: var(--hm-muted); }\n .spine-page-panel__empty-title { margin: 0; color: var(--hm-text); font-size: var(--hm-font-size-lg, 18px); font-weight: 600; }\n .spine-page-panel__empty-description { margin: 0; max-inline-size: 32ch; font-size: var(--hm-font-size-sm, 14px); }\n `],\n})\nexport class SpinePagePanelComponent {\n protected readonly text = inject(SPINE_MESSAGES).pagePanel;\n readonly url = input.required<string>();\n /** Só o painel focado fala pela página inteira: visita recente, título da aba e rota no logger. */\n readonly isFocusedPanel = input(true);\n\n private readonly viewService = inject(ViewService);\n private readonly distributor = inject(ComponentDistributorService);\n private readonly logger = inject(LoggerService);\n private readonly title = inject(Title);\n\n protected readonly loading = signal(true);\n protected readonly component = signal<Type<unknown> | null>(null);\n protected readonly chain = signal<Route[] | null>(null);\n\n constructor() {\n effect(() => {\n const url = this.url();\n void this.resolve(url);\n });\n // Com as abas mantidas vivas, o painel que recebe o foco de volta já tem a tela pronta; basta\n // reaplicar o que só o focado faz, sem carregar nada de novo.\n effect(() => {\n if (this.isFocusedPanel() && this.chain()) this.afterResolved();\n });\n }\n\n /** Cadeia de rotas da url (sem os nós que só agrupam) e o componente da última delas. */\n private async resolve(url: string): Promise<void> {\n const chain = resolveEffectiveRouteChain(\n spineRoutesOf(this.viewService.currentView),\n (u) => this.viewService.getLevel(u),\n (u, level) => this.viewService.getUrlAtLevel(u, level),\n url,\n );\n this.chain.set(chain);\n\n const leaf = chain?.at(-1) ?? null;\n if (!leaf) {\n this.component.set(null);\n this.loading.set(false);\n return;\n }\n\n const cached = componentCache.get(url);\n if (cached) {\n this.component.set(cached);\n this.loading.set(false);\n this.afterResolved();\n return;\n }\n\n this.loading.set(true);\n this.component.set(null);\n\n const component = await this.distributor.getComponent(routerIdOf(leaf) ?? '', leaf.source_template_router_id);\n\n // A url mudou enquanto o carregamento corria: este resultado já não interessa.\n if (url !== this.url()) return;\n\n componentCache.set(url, component);\n this.component.set(component);\n this.loading.set(false);\n this.afterResolved();\n }\n\n /** O que acontece quando a tela do painel focado fica pronta. */\n private afterResolved(): void {\n if (!this.isFocusedPanel()) return;\n const chain = this.chain();\n if (chain) this.logger.setLogger(chain);\n const leafName = chain?.at(-1)?.route_display_name;\n if (leafName) this.title.setTitle(leafName);\n }\n}\n","import { Directive, DestroyRef, ElementRef, inject, input, output } from '@angular/core';\n\n/**\n * Em painéis NÃO focados do `hm-workspace`, um `<a href>`/`[routerLink]` clicado navegaria o\n * `Router` de verdade — que só existe UM na aplicação, e está sempre atrelado ao painel FOCADO\n * (ver `SpineWorkspaceNavService`). Sem isto, clicar num link dentro de um painel secundário (um\n * item da sidebar, uma aba de submenu, um link de breadcrumb, qualquer `routerLink` dentro de uma\n * tela de feature) navegaria a tela ERRADA — o painel focado, não o painel onde o clique\n * aconteceu. Porte 1:1 do mesmo diretório do docs/website\n * (`docs/website/src/app/workspace/panel-local-link.directive.ts`) — genérico, sem nada\n * específico do site de documentação.\n *\n * Intercepta em fase de CAPTURA pra resolver a navegação LOCALMENTE antes do `RouterLink`\n * conseguir agir. Abrir em nova aba (Ctrl/⌘ + clique, clique do meio) continua funcionando\n * normalmente — só intercepta o clique comum.\n */\n@Directive({ selector: '[appPanelLocalLink]' })\nexport class PanelLocalLinkDirective {\n /** `true` = intercepta (painel não-focado); `false` = deixa o `RouterLink` normal agir. */\n readonly appPanelLocalLink = input(false);\n readonly localNavigate = output<string>();\n\n constructor() {\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n const destroyRef = inject(DestroyRef);\n\n const onClick = (event: MouseEvent): void => {\n if (!this.appPanelLocalLink()) return;\n if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n\n const anchor = (event.target as HTMLElement).closest('a[href]');\n if (!anchor || !host.contains(anchor)) return;\n const href = anchor.getAttribute('href');\n if (!href || !href.startsWith('/')) return; // só rotas internas do próprio app\n\n event.preventDefault();\n event.stopPropagation();\n this.localNavigate.emit(href);\n };\n\n host.addEventListener('click', onClick, true);\n destroyRef.onDestroy(() => host.removeEventListener('click', onClick, true));\n }\n}\n","import DOMPurify, { type Config, type DOMPurify as Purifier } from 'dompurify';\n\n/**\n * Perfil do DOMPurify para o Markdown do spine (documentação de tela, novidades). Mais restrito que o\n * padrão: o HTML entra no DOM do shell (sem shadow DOM), então\n * - `<style>` e o atributo `style` ficam de fora (CSS valeria para a página inteira: esconder/redesenhar a\n * UI, sobrepor um aviso falso com `position: fixed`, exfiltrar por seletor de atributo);\n * - formulário e controles (`<form>`, `<input>`, `<button>`, `<textarea>`, `<select>`) e `<iframe>` ficam de\n * fora (tela de login falsa dentro do conteúdo);\n * - link para outra origem abre em outra aba com `rel=\"noopener noreferrer\"`.\n */\nexport const SPINE_MARKDOWN_PURIFY_CONFIG: Config = {\n FORBID_TAGS: ['style', 'form', 'input', 'button', 'textarea', 'select', 'option', 'iframe', 'frame', 'frameset', 'object', 'embed', 'link', 'meta', 'base'],\n FORBID_ATTR: ['style', 'target', 'formaction', 'action'],\n ALLOW_DATA_ATTR: false,\n};\n\nlet instance: Purifier | null | undefined;\n\n/** Instância própria (o hook de links não vaza para o DOMPurify global que o app use). `null` sem DOM. */\nfunction purifier(): Purifier | null {\n if (instance !== undefined) return instance;\n if (typeof window === 'undefined') return (instance = null);\n const purify = DOMPurify(window);\n if (!purify.isSupported) return (instance = null);\n purify.addHook('afterSanitizeAttributes', (node) => {\n if (node.nodeName !== 'A') return;\n const href = node.getAttribute('href');\n if (!href) return;\n let external = false;\n try {\n external = new URL(href, window.location.href).origin !== window.location.origin;\n } catch {\n external = false;\n }\n if (external) {\n node.setAttribute('target', '_blank');\n node.setAttribute('rel', 'noopener noreferrer');\n }\n });\n return (instance = purify);\n}\n\n/** HTML limpo pelo perfil do spine, ou `null` quando não há DOM (SSR: melhor não renderizar). */\nexport function sanitizeSpineMarkdownHtml(html: string): string | null {\n const purify = purifier();\n return purify ? (purify.sanitize(html, SPINE_MARKDOWN_PURIFY_CONFIG) as string) : null;\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Marked } from 'marked';\nimport { sanitizeSpineMarkdownHtml } from './markdown-sanitize';\n\n// Instância própria: não mexe nas opções globais do `marked` que o app possa usar.\nconst parser = new Marked({ gfm: true, breaks: false, async: false });\n\n/**\n * Renderiza Markdown (GFM) como HTML com a tipografia do design system. O texto é tratado como dado:\n * o HTML gerado passa pelo DOMPurify, com o perfil restrito do spine (`SPINE_MARKDOWN_PURIFY_CONFIG`: sem\n * `<style>`/`style`, formulários e `<iframe>`; link externo com `rel=\"noopener noreferrer\"`), antes de chegar ao DOM.\n */\n@Component({\n selector: 'spine-markdown',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // O HTML injetado não recebe os atributos do encapsulamento; os estilos ficam presos a `.spine-md`.\n encapsulation: ViewEncapsulation.None,\n template: `\n @if (html(); as markup) {\n <div class=\"spine-md\" [innerHTML]=\"markup\"></div>\n }\n `,\n styles: `\n .spine-md {\n color: var(--hm-text);\n font-size: var(--hm-font-size-sm);\n line-height: var(--hm-line-height-normal);\n overflow-wrap: anywhere;\n }\n .spine-md > :first-child { margin-block-start: 0; }\n .spine-md > :last-child { margin-block-end: 0; }\n .spine-md :is(h1, h2, h3, h4, h5, h6) {\n margin-block: var(--hm-space-lg) var(--hm-space-sm);\n color: var(--hm-text);\n font-weight: var(--hm-font-weight-semibold);\n line-height: var(--hm-line-height-snug);\n }\n .spine-md h1 { font-size: var(--hm-font-size-xxl); }\n .spine-md h2 { font-size: var(--hm-font-size-xl); }\n .spine-md h3 { font-size: var(--hm-font-size-lg); }\n .spine-md :is(h4, h5, h6) { font-size: var(--hm-font-size-md); }\n .spine-md :is(p, ul, ol, blockquote, pre, table) { margin-block: 0 var(--hm-space-md); }\n .spine-md :is(ul, ol) { padding-inline-start: var(--hm-space-lg); }\n .spine-md li + li { margin-block-start: var(--hm-space-micro); }\n .spine-md blockquote {\n margin-inline: 0;\n padding-inline-start: var(--hm-space-md);\n border-inline-start: var(--hm-border-thin) solid var(--hm-divider);\n color: var(--hm-muted);\n }\n .spine-md code {\n padding-inline: var(--hm-space-micro);\n border-radius: var(--hm-radius-micro);\n background: var(--hm-surface-raised);\n font-family: var(--hm-font-mono);\n font-size: var(--hm-font-size-xs);\n }\n .spine-md pre {\n padding: var(--hm-space-sm) var(--hm-space-md);\n border-radius: var(--hm-radius);\n background: var(--hm-surface-raised);\n white-space: pre-wrap;\n }\n .spine-md pre code { padding: 0; background: none; }\n .spine-md table {\n display: block;\n max-inline-size: 100%;\n overflow-x: auto;\n border-collapse: collapse;\n overflow-wrap: normal;\n }\n .spine-md :is(th, td) {\n padding: var(--hm-space-xs) var(--hm-space-sm);\n border: var(--hm-border-hairline) solid var(--hm-divider);\n text-align: start;\n vertical-align: top;\n }\n .spine-md th { background: var(--hm-surface-raised); font-weight: var(--hm-font-weight-semibold); }\n .spine-md hr {\n margin-block: var(--hm-space-lg);\n border: 0;\n border-block-start: var(--hm-border-hairline) solid var(--hm-divider);\n }\n .spine-md a {\n color: var(--hm-accent);\n text-decoration: underline;\n text-underline-offset: 0.2em;\n }\n .spine-md a:focus-visible {\n outline: var(--hm-border-thin) solid var(--hm-accent);\n outline-offset: var(--hm-border-hairline);\n border-radius: var(--hm-radius-micro);\n }\n .spine-md img { max-inline-size: 100%; block-size: auto; }\n `,\n})\nexport class SpineMarkdownComponent {\n /** Markdown cru. Vazio não desenha nada. */\n readonly content = input('');\n\n readonly #sanitizer = inject(DomSanitizer);\n\n protected readonly html = computed<SafeHtml | null>(() => {\n const source = this.content();\n // Sem DOM (SSR) o DOMPurify não limpa nada; melhor não renderizar.\n if (!source) return null;\n const clean = sanitizeSpineMarkdownHtml(parser.parse(source) as string);\n return clean === null ? null : this.#sanitizer.bypassSecurityTrustHtml(clean);\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core';\nimport {\n AlertComponent,\n ModalComponent,\n SegmentedControlComponent,\n SegmentedOption,\n SkeletonComponent,\n} from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { DocsEntry, DocsGroup, DocsView, SpineDocsService } from './docs.service';\nimport { SpineMarkdownComponent } from './markdown.component';\n\nlet sequence = 0;\n\n/** Compara sem acento e sem caixa. */\nfunction fold(text: string): string {\n return text.normalize('NFD').replace(/\\p{M}/gu, '').toLowerCase();\n}\n\n/**\n * Modal de documentação das telas: índice (com busca) à esquerda e leitura à direita. Montado uma vez\n * pelo `spine-layout`; abrir, fechar e o que se lê vêm todos do `SpineDocsService`.\n */\n@Component({\n selector: 'spine-docs',\n imports: [ModalComponent, AlertComponent, SkeletonComponent, SegmentedControlComponent, SpineMarkdownComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (docs.isOpen()) {\n <hm-modal [heading]=\"text.docs.heading\" size=\"large\" [open]=\"true\" (closed)=\"docs.close()\">\n <div class=\"layout\">\n <nav class=\"index\" [attr.aria-label]=\"text.docs.index\">\n <input\n class=\"filter\"\n type=\"search\"\n [placeholder]=\"text.docs.search\"\n [attr.aria-label]=\"text.docs.search\"\n [value]=\"query()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n @for (group of filtered(); track group.title; let g = $index) {\n <p class=\"group-title\" [id]=\"groupId + g\">{{ group.title }}</p>\n <ul class=\"entries\" [attr.aria-labelledby]=\"groupId + g\">\n @for (entry of group.entries; track entry.id) {\n <li>\n <button\n type=\"button\"\n class=\"entry\"\n [class.entry--active]=\"entry.id === docs.current()?.id\"\n [attr.aria-current]=\"entry.id === docs.current()?.id ? 'true' : null\"\n (click)=\"select(entry)\"\n >\n {{ entry.title }}\n </button>\n </li>\n }\n </ul>\n } @empty {\n <p class=\"note\">{{ query().trim() ? text.docs.noMatch : text.docs.empty }}</p>\n }\n </nav>\n\n <section class=\"reader\">\n @if (docs.current(); as entry) {\n <h3 class=\"reader-title\">{{ entry.title }}</h3>\n @if (docs.showTechnical()) {\n <hm-segmented-control\n [label]=\"text.docs.view\"\n [options]=\"viewOptions()\"\n [value]=\"docs.view()\"\n (valueChange)=\"switchView($event)\"\n />\n }\n <!-- A chave muda com o documento ou a visão: o bloco é recriado e entra de novo. -->\n @for (key of readingKey(); track key) {\n <div class=\"reading\">\n @if (docs.loading()) {\n <hm-skeleton shape=\"text\" [count]=\"6\" [label]=\"text.docs.loading\" />\n } @else if (docs.error()) {\n <hm-alert variant=\"error\">{{ docs.error() }}</hm-alert>\n } @else {\n <spine-markdown [content]=\"docs.content()\" />\n }\n </div>\n }\n } @else {\n <p class=\"note\">{{ text.docs.invite }}</p>\n }\n </section>\n </div>\n </hm-modal>\n }\n `,\n styles: `\n .layout {\n display: grid;\n grid-template-columns: minmax(12rem, 16rem) minmax(0, 1fr);\n gap: var(--hm-space-lg);\n block-size: min(70vh, 48rem);\n min-block-size: 0;\n }\n .index,\n .reader {\n min-block-size: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n }\n .index {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-xs);\n padding-inline-end: var(--hm-space-md);\n border-inline-end: var(--hm-border-hairline) solid var(--hm-divider);\n }\n .filter {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: var(--hm-control-height);\n margin-block-end: var(--hm-space-sm);\n padding-inline: var(--hm-space-sm);\n border: var(--hm-border-hairline) solid var(--hm-border);\n border-radius: var(--hm-radius-control);\n background: var(--hm-surface-raised);\n color: var(--hm-text);\n font: inherit;\n font-size: var(--hm-font-size-sm);\n }\n .filter::placeholder { color: var(--hm-placeholder); }\n .filter:focus-visible {\n outline: var(--hm-border-thin) solid var(--hm-accent);\n outline-offset: var(--hm-border-hairline);\n }\n .group-title {\n margin: var(--hm-space-sm) 0 0;\n color: var(--hm-muted);\n font-size: var(--hm-font-size-xs);\n font-weight: var(--hm-font-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .entries {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-micro);\n margin: 0;\n padding: 0;\n list-style: none;\n }\n .entry {\n inline-size: 100%;\n padding: var(--hm-space-xs) var(--hm-space-sm);\n border: var(--hm-border-hairline) solid transparent;\n border-radius: var(--hm-radius-control);\n background: transparent;\n color: var(--hm-text);\n font: inherit;\n font-size: var(--hm-font-size-sm);\n text-align: start;\n cursor: pointer;\n transition: background-color var(--hm-duration-quick) var(--hm-ease);\n }\n .entry:hover { background: var(--hm-hover); }\n .entry:focus-visible {\n outline: var(--hm-border-thin) solid var(--hm-accent);\n outline-offset: calc(var(--hm-border-thin) * -1);\n }\n .entry--active {\n background: var(--hm-accent-subtle);\n color: var(--hm-accent-strong);\n font-weight: var(--hm-font-weight-semibold);\n }\n .reader {\n display: flex;\n flex-direction: column;\n gap: var(--hm-space-md);\n align-items: stretch;\n }\n .reader-title {\n margin: 0;\n color: var(--hm-text);\n font-size: var(--hm-font-size-lg);\n font-weight: var(--hm-font-weight-semibold);\n }\n .reading { animation: spine-docs-enter var(--hm-duration-standard) var(--hm-ease-decelerate); }\n .note {\n margin: 0;\n color: var(--hm-muted);\n font-size: var(--hm-font-size-sm);\n }\n @keyframes spine-docs-enter {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n @media (max-width: 767px) {\n .layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: minmax(0, 2fr) minmax(0, 3fr);\n }\n .index {\n padding-inline-end: 0;\n padding-block-end: var(--hm-space-md);\n border-inline-end: 0;\n border-block-end: var(--hm-border-hairline) solid var(--hm-divider);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .reading { animation: none; }\n .entry { transition: none; }\n }\n :host-context([data-motion='reduce']) .reading { animation: none; }\n :host-context([data-motion='reduce']) .entry { transition: none; }\n @media (forced-colors: active) {\n .entry--active { border-color: Highlight; }\n }\n `,\n})\nexport class SpineDocsComponent {\n protected readonly docs = inject(SpineDocsService);\n protected readonly text = inject(SPINE_MESSAGES);\n protected readonly query = signal('');\n protected readonly groupId = `spine-docs-group-${++sequence}-`;\n\n protected readonly viewOptions = computed<SegmentedOption<DocsView>[]>(() => [\n { value: 'usage', label: this.text.docs.usage },\n { value: 'technical', label: this.text.docs.technical },\n ]);\n\n protected readonly filtered = computed<DocsGroup[]>(() => {\n const needle = fold(this.query().trim());\n const groups = this.docs.index();\n if (!needle) return groups;\n return groups\n .map((group) => ({\n title: group.title,\n entries: group.entries.filter((entry) => fold(`${entry.title} ${group.title}`).includes(needle)),\n }))\n .filter((group) => group.entries.length > 0);\n });\n\n protected readonly readingKey = computed(() => [`${this.docs.current()?.id ?? ''}:${this.docs.view()}`]);\n\n protected select(entry: DocsEntry): void {\n void this.docs.open(entry);\n }\n\n protected switchView(view: string): void {\n void this.docs.show(view === 'technical' ? 'technical' : 'usage');\n }\n}\n\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { AlertComponent, ButtonComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n/**\n * Aviso discreto de conexão no topo do shell, sobre o `connectionState$` e o `reauthorizationRequired$` do\n * `@orfeu/angular`. A sessão nunca cai por nada disto (sem rede, Argos fora do ar, refresh recusado):\n * a lib segue tentando sozinha e este banner só conta o que está acontecendo.\n *\n * - `offline`: aviso (`warning`) — Argos inalcançável; a lib tenta de novo com backoff e na volta da rede/foco.\n * - `reconnecting` / `reauthorizing`: informativo (`info`), some quando volta a `online`.\n * - `reauthorizationRequired$`: o Argos recusou a renovação e a reautorização automática não aconteceu\n * (desligada, outra aba cuidando ou proteção contra loop). Oferece \"Entrar novamente\", que chama\n * `authorize(urlAtual)` — o login volta para a mesma tela. Nunca chama `logout()`.\n *\n * `hm-alert` em `appearance=\"banner\"` e `size=\"small\"`: faixa de largura total, sem cantos, com os tokens\n * de status do Hermes (`--hm-warning-*`/`--hm-info-*`); `role=\"status\"` (não interrompe o leitor de tela).\n */\n@Component({\n selector: 'spine-connection-banner',\n imports: [AlertComponent, ButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @switch (notice()) {\n @case ('reauthorizationRequired') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"warning\">\n {{ text.reauthorizationRequired }}\n <hm-button actions emphasis=\"medium\" size=\"small\" icon=\"login\" (clicked)=\"signInAgain()\">{{ text.signInAgain }}</hm-button>\n </hm-alert>\n }\n @case ('offline') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"warning\">{{ text.offline }}</hm-alert>\n }\n @case ('reconnecting') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"info\">{{ text.reconnecting }}</hm-alert>\n }\n @case ('reauthorizing') {\n <hm-alert appearance=\"banner\" size=\"small\" variant=\"info\">{{ text.reauthorizing }}</hm-alert>\n }\n }\n `,\n styles: [`:host { display: block; flex: none; }`],\n})\nexport class SpineConnectionBannerComponent {\n protected readonly text = inject(SPINE_MESSAGES).session;\n private readonly auth = inject(AuthorizationService);\n private readonly router = inject(Router);\n\n private readonly state = toSignal(this.auth.connectionState$, { initialValue: this.auth.connectionState });\n private readonly reauthRequired = toSignal(this.auth.reauthorizationRequired$, {\n initialValue: this.auth.reauthorizationRequired,\n });\n\n /** O que mostrar: a decisão pendente da pessoa vence o estado da conexão; `online` não mostra nada. */\n protected readonly notice = computed(() => (this.reauthRequired() ? 'reauthorizationRequired' : this.state()));\n\n protected signInAgain(): void {\n void this.auth.authorize(this.router.url);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { ButtonComponent, ModalComponent } from '@trismegisto/angular';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { pluralMessage } from '@trismegisto/primitives';\nimport { SpineIdleService } from './idle.service';\n\n/**\n * Aviso de \"Encerrar por inatividade\" (`SpineIdleService`): contagem regressiva, \"Continuar conectado\" (padrão, e o\n * que fechar pelo X/Esc faz) e \"Sair agora\". Montado uma vez no `spine-layout`.\n */\n@Component({\n selector: 'spine-idle-warning',\n imports: [ButtonComponent, ModalComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (idle.warning()) {\n <hm-modal [open]=\"true\" [heading]=\"text.idleWarningHeading\" size=\"small\" (openChange)=\"onOpenChange($event)\">\n <p class=\"sp-idle__text\" role=\"timer\">{{ countdown() }}</p>\n <div footer class=\"sp-idle__actions\">\n <hm-button emphasis=\"medium\" icon=\"logout\" (clicked)=\"idle.logoutNow()\">{{ text.idleLogout }}</hm-button>\n <hm-button emphasis=\"high\" (clicked)=\"idle.stay()\">{{ text.idleStay }}</hm-button>\n </div>\n </hm-modal>\n }\n `,\n styles: [`\n .sp-idle__text { margin: 0; }\n .sp-idle__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--hm-space-2); }\n `],\n})\nexport class SpineIdleWarningComponent {\n protected readonly idle = inject(SpineIdleService);\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.accountFeatures;\n protected readonly countdown = computed(() =>\n pluralMessage(this.text.idleWarningText, this.idle.secondsLeft(), this.messages.meta.locale));\n\n protected onOpenChange(open: boolean): void {\n if (!open) this.idle.stay();\n }\n}\n","import { Component, OnInit, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { NavigationEnd, Router, RouterOutlet } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { ToastStackComponent, WorkspaceComponent } from '@trismegisto/angular';\nimport { ModalComponent } from '@trismegisto/spine/modal';\nimport { NotificationComponent } from '@trismegisto/spine/notification';\nimport { SidePanelComponent } from '@trismegisto/spine/side-panel';\nimport { ThemeService, SpinePreferencesService } from '@trismegisto/spine';\nimport { HeaderComponent } from './header/header.component';\nimport { SidebarComponent } from './sidebar/sidebar.component';\nimport { OnboardingOverlayComponent } from './onboarding/onboarding-overlay.component';\nimport { OnboardingService } from './onboarding/onboarding.service';\nimport { SpineNewsComponent } from './news/news.component';\nimport { SpineNewsService } from './news/news.service';\nimport { ShortcutsCheatsheetComponent } from './shortcuts/shortcuts-cheatsheet.component';\nimport { SettingsPanelComponent } from './settings/settings-panel.component';\nimport { SpineSettingsService } from './settings/settings.service';\nimport { ShortcutService } from './shortcuts/shortcut.service';\nimport { SpineWorkspaceNavService } from './workspace/spine-workspace-nav.service';\nimport { SpinePagePanelComponent } from './workspace/spine-page-panel.component';\nimport { PanelLocalLinkDirective } from './workspace/panel-local-link.directive';\nimport { SpineDocsComponent } from './docs/docs-modal.component';\nimport { SpineConnectionBannerComponent } from './connection/connection-banner.component';\nimport { SpineLogoutService } from './logout/logout.service';\nimport { SpineIdleService } from './idle/idle.service';\nimport { SpineIdleWarningComponent } from './idle/idle-warning.component';\nimport { SpineStartPageService } from './start-page/start-page.service';\nimport { SpineAccountPreferencesService } from './account-preferences/account-preferences.service';\n\n/**\n * Shell do spine — MESMA estrutura do `docs/website`'s `app.component.html`/`.scss` (decisão de\n * 2026-09-28, ver `hefesto-migration-plan.md`): `.shell` com altura de viewport de verdade\n * (`100dvh`, não `%` cascateado — `@trismegisto/core` não fixa altura de `html`/`body`, é\n * responsabilidade de quem consome, mesmo tanto quanto o docs faz no próprio `styles.scss`),\n * `hm-header` (utilitários — tema/densidade/apps/perfil, nunca navegação de página) + `.body`\n * (`hm-sidebar` fixa + `.main` com `hm-workspace`). **Sem barra de breadcrumb própria** — isso\n * era resíduo do spine antigo (`spine-navigation`), removido: o docs não tem uma, a navegação\n * inteira mora na sidebar. Entre o header e o corpo fica o `spine-connection-banner` (aviso de conexão\n * do `@orfeu/angular`, vazio quando `online`). Os avisos ficam no `spine-notification` (`NotificationService`) e\n * no `hm-toast-stack` (`HermesToastService`), os dois montados aqui: o app não monta nenhum.\n *\n * O `<router-outlet>` que sobra aqui é só pra `/no-permission` (a única rota do shell com\n * `component` de verdade — o resto da árvore do backend nunca passa pelo `Router` pra renderizar,\n * só pra `ViewGuard` confirmar que a URL resolve). Fica sempre montado (nunca dentro de um `@if`)\n * e escondido via `[hidden]` quando não é a rota ativa — destruir/recriar o outlet num `@if`\n * arriscaria perder a ativação da rota se a navegação e a checagem de `isNoPermission` não\n * corressem na mesma volta de detecção de mudanças.\n */\n@Component({\n selector: 'spine-layout',\n imports: [\n SpineNewsComponent,\n SpineDocsComponent,\n HeaderComponent,\n SidebarComponent,\n SpineConnectionBannerComponent,\n SpinePagePanelComponent,\n PanelLocalLinkDirective,\n WorkspaceComponent,\n ToastStackComponent,\n RouterOutlet,\n ModalComponent,\n NotificationComponent,\n SidePanelComponent,\n OnboardingOverlayComponent,\n ShortcutsCheatsheetComponent,\n SettingsPanelComponent,\n SpineIdleWarningComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"shell\">\n <spine-header></spine-header>\n <!-- Aviso de conexão do @orfeu/angular (offline/reconectando/reautorizando): faixa entre o header e o corpo. -->\n <spine-connection-banner />\n <div class=\"body\">\n @if (!isNoPermission) {\n <spine-sidebar class=\"sidebar\" data-tour=\"nav\"></spine-sidebar>\n }\n <div class=\"main\" role=\"main\">\n <div [hidden]=\"isNoPermission\" class=\"workspace-area\">\n <hm-workspace data-tour=\"tabs\" [keepAlive]=\"true\" [providedStore]=\"workspace.store\" (newTabRequested)=\"workspace.openNewTab($event)\">\n <ng-template #content let-tab let-panelId=\"panelId\" let-active=\"active\">\n <div\n class=\"panel-content\"\n [appPanelLocalLink]=\"panelId !== workspace.focusedPanelId()\"\n (localNavigate)=\"onLocalNavigate(panelId, $event)\"\n >\n <spine-page-panel [url]=\"tab.id\" [isFocusedPanel]=\"active && panelId === workspace.focusedPanelId()\" />\n </div>\n </ng-template>\n </hm-workspace>\n </div>\n <router-outlet></router-outlet>\n </div>\n </div>\n </div>\n <spine-notification></spine-notification>\n <!-- Avisos do HermesToastService (configurações, conta e segurança, auto-serviço…). Se o app também montar\n uma, só uma desenha (o serviço escolhe a pilha ativa): nunca em dobro. -->\n <hm-toast-stack />\n <spine-side-panel />\n <spine-modal />\n <spine-shortcuts-cheatsheet></spine-shortcuts-cheatsheet>\n <spine-settings-panel></spine-settings-panel>\n <spine-docs />\n <spine-news />\n <spine-onboarding-overlay></spine-onboarding-overlay>\n <!-- Aviso de \"Encerrar por inatividade\" (SpineFeatures.idleTimeout): só desenha quando abre. -->\n <spine-idle-warning />\n `,\n styles: [`\n :host { display: block; }\n .shell { display: flex; flex-direction: column; height: 100vh; height: 100dvh; background: var(--hm-surface); color: var(--hm-text); }\n .body { position: relative; display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .main { display: flex; flex: 1; min-width: 0; flex-direction: column; }\n /* Abaixo da barra de abas vem a barra de contexto (spine-page-bar, tom elevado), não a folha da\n página: a aba ativa toma o tom dela — o encosto que emenda aba e barra — e a faixa das abas\n inativas fica no outro tom. Só aqui: o padrão do DS (aba ativa = tom da folha) continua valendo\n para quem usa o hm-workspace com o conteúdo direto embaixo. */\n .workspace-area {\n flex: 1; min-height: 0; display: flex; flex-direction: column;\n --hm-tab-strip-bg: var(--hm-surface);\n --hm-tab-active-bg: var(--hm-surface-raised);\n }\n hm-workspace { flex: 1; min-height: 0; }\n /* Sem padding aqui: a barra de contexto (spine-page-bar) ocupa a largura toda do painel; o respiro\n do conteúdo da página é do .spine-page-panel__content (ver spine-page-panel.component.ts). */\n .panel-content { display: flex; flex-direction: column; height: 100%; min-height: 0; }\n `],\n})\nexport class LayoutComponent implements OnInit {\n /** Aplica no boot o idioma e o fuso que a pessoa escolheu nas configurações. */\n private readonly preferences = inject(SpinePreferencesService);\n protected readonly workspace = inject(SpineWorkspaceNavService);\n private readonly settings = inject(SpineSettingsService);\n /** Também liga, uma vez, o aviso de falha do logout (`logoutFailed$` do `@orfeu/angular`). */\n private readonly logoutService = inject(SpineLogoutService);\n /** Recursos opcionais (`SpineConfig.features`): cada serviço não faz nada com o seu recurso desligado. */\n private readonly idle = inject(SpineIdleService);\n private readonly startPage = inject(SpineStartPageService);\n private readonly accountPreferences = inject(SpineAccountPreferencesService);\n\n /** Esconde sidebar e área de trabalho quando a rota ATIVA (do Router real, ver\n * `router.events` abaixo) é a de sem-permissão — nesse caso não existe menu/página válido\n * como contexto. Note que isto reflete só a URL do painel FOCADO (dona do Router real); um\n * painel secundário navegando localmente pra `/no-permission` não passa por aqui — cenário raro\n * o bastante (sem-permissão normalmente bloqueia o app inteiro, não uma aba) pra não justificar\n * mais complexidade agora. */\n public isNoPermission: boolean;\n\n constructor(\n private router: Router,\n private theme: ThemeService,\n private shortcuts: ShortcutService,\n private onboarding: OnboardingService,\n private news: SpineNewsService,\n ) {\n this.isNoPermission = this.matchesNoPermission(this.router.url);\n this.router.events.pipe(filter((e): e is NavigationEnd => e instanceof NavigationEnd))\n .subscribe(e => { this.isNoPermission = this.matchesNoPermission(e.urlAfterRedirects); });\n }\n\n private matchesNoPermission(url: string): boolean {\n return url.split(/[?#]/)[0] === '/no-permission';\n }\n\n ngOnInit(): void {\n // Preferências na conta (lê e aplica uma vez por sessão do app), inatividade e a \"última tela visitada\".\n void this.accountPreferences.start();\n this.idle.start();\n this.startPage.track();\n\n // Liga os atalhos de teclado globais às ações reais do sistema.\n this.shortcuts.setActions({\n navigate: (url) => this.router.navigateByUrl(url),\n toggleTheme: () => this.theme.setTheme(this.theme.current === 'light' ? 'dark' : 'light'),\n toggleFullscreen: () => this.toggleFullscreen(),\n logout: () => void this.logoutService.logout(),\n openSettings: () => this.settings.toggle(),\n });\n\n // Link direto pra uma seção do painel de configurações: `?settings=aparencia` (ou só\n // `?settings`). Tira o parâmetro da URL depois de abrir — senão ele volta a abrir o painel a\n // cada F5 e acompanha a URL copiada pra outra pessoa.\n const params = new URLSearchParams(window.location.search);\n if (params.has('settings')) {\n this.settings.open(params.get('settings') ?? '');\n void this.router.navigate([], { queryParams: { settings: null }, queryParamsHandling: 'merge', replaceUrl: true });\n }\n\n // Onboarding interativo na primeira entrada nesta máquina. Vem ANTES das novidades: quando devido,\n // o tour fica `pending` na hora, e as novidades (que esperam o tour ficar `idle`) já o enxergam.\n // A ordem inversa também funciona — elas conferem o estado de novo antes de abrir —, mas tour\n // primeiro é o caminho direto.\n this.onboarding.maybeStart();\n // Novidades do app (provideSpineNews): abrem sozinhas uma vez, só depois do tour.\n this.news.scheduleOnEntry();\n }\n\n protected onLocalNavigate(panelId: string, href: string): void {\n this.workspace.navigateLocally(panelId, href);\n }\n\n private toggleFullscreen(): void {\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen?.().catch(() => { /* bloqueado pelo navegador */ });\n } else {\n document.exitFullscreen?.();\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i7","HermesHeaderComponent","HermesSidebarComponent","i1.OnboardingService","sequence","i1","i2","i3.ShortcutService","i4.OnboardingService","i5.SpineNewsService","ModalComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;;;;AAIG;MAQU,oBAAoB,CAAA;IAQ/B,WAAA,CACU,WAAiC,EACjC,gBAAkC,EAAA;QADlC,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;AATP,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM;AACtC,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAEzC,IAAA,CAAA,IAAI,GAAa,EAAE;QACnB,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,IAAI,GAAG,KAAK;IAKhB;AAEH,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;;;;;AAKzC,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE;QACxE;AAAE,QAAA,MAAM;;AAEN,YAAA,IAAI,CAAC,IAAI,GAAG,EAAE;QAChB;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;AAEpB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI;IACxB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK;IACnB;+GAtCW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClBjC,ikCAqBA,EAAA,MAAA,EAAA,CAAA,w2CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDRY,YAAY,gQAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAKvE,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,OAAA,EACrB,CAAC,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,sBAAsB,CAAC,EAAA,eAAA,EAElE,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,ikCAAA,EAAA,MAAA,EAAA,CAAA,w2CAAA,CAAA,EAAA;;;AEbhD;;;;;;;;AAQG;MACU,WAAW,GAAG,IAAI,cAAc,CAAuB,aAAa,EAAE;AACjF,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,IAAI;AACpB,CAAA;;ACRD;;;;;;;;;AASG;MA4BU,mBAAmB,CAAA;AA3BhC,IAAA,WAAA,GAAA;;AA6BW,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAgB,IAAI,gFAAC;;AAEtC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,EAAE,4EAAC;QAET,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjD,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAC1B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;QAC3B,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,QAAQ;QAC5C,IAAA,CAAA,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAC7C,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,KAAK,KAAK;;AAEhD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,6EAAC;;AAGvD,QAAA,IAAA,CAAA,GAAG,GAAG,QAAQ,CAAgB,MAAK;AAC1C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO;AACzB,YAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,IAAI;AACpC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,IAAI;AAC1F,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK;AACnD,QAAA,CAAC,0EAAC;QAEO,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAE9E,QAAA,IAAA,CAAA,GAAG,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,0EAAC;AAM7F,IAAA;AAJC,IAAA,OAAO,CAAC,GAAW,EAAA;QACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD;+GA/BW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxBpB;;;;;;;;;;;;;;;;;;;;AAoBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ksBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EArBS,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAyB9C,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBA3B/B,SAAS;+BACE,aAAa,EAAA,OAAA,EACd,CAAC,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAChD;;;;;;;;;;;;;;;;;;;;GAoBT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,ksBAAA,CAAA,EAAA;;;ACrBjD;AACA,MAAM,kBAAkB,GAAG,IAAI;AAE/B;AACA,MAAM,cAAc,GAAG,GAAG;AAE1B;AACA;AACA,MAAM,cAAc,GAAG,IAAI;AAC3B,MAAM,cAAc,GAAG,GAAG;AAE1B;;;;;AAKG;AACG,SAAU,cAAc,CAAC,QAAgB,EAAA;AAC7C,IAAA,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAc,QAAQ,CAAC,CAAC,EAAE;AAC7E,QAAA,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE;AACpC,QAAA,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE;IACtE;AACA,IAAA,OAAO,IAAI;AACb;AAEA;;;;AAIG;MAEU,iBAAiB,CAAA;;IAa5B,IAAI,KAAK,GAAA,EAAsB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAO/D,IAAA,WAAA,CAA8C,MAA0B,EAAA;AAnBvD,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI;;AAEnC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAIpC,IAAI,CAAC;AAEE,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,eAAe,CAAkB,MAAM,CAAC;;AAE5D,QAAA,IAAA,CAAA,MAAM,GAAgC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;QAK9E,IAAA,CAAA,KAAK,GAAqB,EAAE;QAC5B,IAAA,CAAA,KAAK,GAAG,CAAC;QACT,IAAA,CAAA,OAAO,GAAyC,IAAI;AAG1D,QAAA,MAAM,EAAE,GAAG,MAAM,EAAE,QAAQ,IAAI,KAAK;QACpC,IAAI,CAAC,OAAO,GAAG,CAAA,EAAG,EAAE,CAAA,YAAA,EAAe,kBAAkB,EAAE;IACzD;AAEA,IAAA,IAAY,IAAI,GAAA;AACd,QAAA,IAAI;YAAE,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,MAAM;QAAE;AAAE,QAAA,MAAM;AAAE,YAAA,OAAO,IAAI;QAAE;IACrF;IACQ,QAAQ,GAAA;AACd,QAAA,IAAI;YAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;QAAE;AAAE,QAAA,MAAM,uCAAuC;IACnG;AAEA;;;;AAIG;IACH,UAAU,GAAA;QACR,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxB,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,cAAc,CAAC;IAC/D;;IAGA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE;IACd;AAEA;;;AAGG;IACH,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM;YAAE;QAC3B,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACvB;;IAGQ,QAAQ,GAAA;AACd,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI;QACnB,OAAO;YACL,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;AACrD,YAAA,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE;AAC7E,YAAA,EAAE,MAAM,EAAE,sBAAsB,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE;AACnF,YAAA,EAAE,MAAM,EAAE,wCAAwC,EAAE,KAAK,EAAE,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,cAAc,EAAE;AAC7G,YAAA,EAAE,MAAM,EAAE,uCAAuC,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;AACtG,YAAA,EAAE,MAAM,EAAE,+BAA+B,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE;AACxF,YAAA,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE;AAC/E,YAAA,EAAE,MAAM,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE;AACrF,YAAA,EAAE,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE;AAChF,YAAA,EAAE,MAAM,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;AACtF,YAAA,EAAE,MAAM,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,CAAC,cAAc,EAAE;AAC/F,YAAA,EAAE,MAAM,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;YACtF,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE;SAChD;IACH;AAEA;;;;AAIG;IACK,KAAK,GAAA;QACX,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC7B,MAAM,OAAO,GAAG,CAAC,IAAoB,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI;AAE9F,QAAA,MAAM,OAAO,GAAG,CAAC,MAAc,KAAU;AACvC,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,GAAG,cAAc,EAAE;AACpD,gBAAA,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC,EAAE,cAAc,CAAC;gBACjF;YACF;AACA,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;YACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;AAClC,YAAA,IAAI,CAAC,KAAK,GAAG,CAAC;AACd,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBACtB,IAAI,CAAC,QAAQ,EAAE;AACf,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACrB;YACF;YACA,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC1B,QAAA,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACZ;IAEQ,IAAI,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACnG;AAEQ,IAAA,QAAQ,CAAC,KAAsB,EAAA;AACrC,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,KAAK;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IACtE;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;AACrD,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;IACrB;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAAE,IAAI,CAAC,MAAM,EAAE;YAAE;QAAQ;QAClE,IAAI,CAAC,KAAK,EAAE;QACZ,IAAI,CAAC,IAAI,EAAE;IACb;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;YAAE;QACrB,IAAI,CAAC,KAAK,EAAE;QACZ,IAAI,CAAC,IAAI,EAAE;IACb;;IAGA,MAAM,GAAA;QACJ,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,QAAQ,EAAE;AACf,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACvB;IAEA,IAAI,OAAO,GAAA,EAAc,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;AAClD,IAAA,IAAI,MAAM,GAAA,EAAc,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAhJ1D,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,kBAoBI,YAAY,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AApBjC,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA,CAAA;;4FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAqBnB;;0BAAY,MAAM;2BAAC,YAAY;;;ACjE9C;AACwB;AACxB,MAAM,aAAa,GAAG,GAAG;AAEzB;;;;;;;;;;AAUG;MAEU,gBAAgB,CAAA;AAW3B,IAAA,WAAA,GAAA;AAViB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtC,QAAA,IAAA,CAAA,KAAK,GAA6B,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;;AAI/F,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAA4B,EAAE,6EAAC;AAC9C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;;AAEtB,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,6EAAC;AAGzD,QAAA,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ;AAC7D,QAAA,IAAI,CAAC,OAAO,GAAG,CAAA,EAAG,EAAE,GAAG,CAAA,OAAA,EAAU,EAAE,EAAE,GAAG,QAAQ,YAAY;;QAG5D,IAAI,CAAC,UAAU,CAAC;AACb,aAAA,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,kBAAkB,EAAE;aACjE,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAClC;AAEA;;;;;AAKG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE;QAC7B,MAAM,QAAQ,GAAG,MAAW;AAC1B,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;gBACvF,UAAU,CAAC,MAAK;AACd,oBAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,MAAM;AAAE,wBAAA,QAAQ,EAAE;;wBAC3C,IAAI,CAAC,OAAO,EAAE;gBACrB,CAAC,EAAE,aAAa,CAAC;AACnB,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,QAAQ,EAAE;IACZ;;IAGA,OAAO,GAAA;AACL,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAChB;AAEA;;;AAGG;IACH,OAAO,GAAA;AACL,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE;AAC1B,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;AACtB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAChB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;AAEQ,IAAA,IAAI,CAAC,KAA+B,EAAA;AAC1C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AAC7C,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB;;IAGQ,OAAO,GAAA;AACb,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;IAC/D;IAEQ,GAAG,GAAA;AACT,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD;IAEQ,QAAQ,GAAA;AACd,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAa,CAAC;QACpF;AAAE,QAAA,MAAM;YACN,OAAO,IAAI,GAAG,EAAE;QAClB;IACF;AAEQ,IAAA,QAAQ,CAAC,GAAsB,EAAA;AACrC,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,YAAA,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjC,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAC/D;AAAE,QAAA,MAAM;;QAER;IACF;+GAnGW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AChBlC;AACA,MAAM,qBAAqB,GAAG,CAAC;AAS/B;;;;;;;;;;;;AAYG;MAEU,kBAAkB,CAAA;AAY7B,IAAA,WAAA,GAAA;AAXiB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAA6B;AAC/D,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACtC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC3C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;QAG1C,IAAA,CAAA,QAAQ,GAA4B,IAAI;;AAGvC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AAG9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;QACvC,IAAI,CAAC,aAAa,GAAG,OAAO,OAAO,EAAE,SAAS,KAAK,UAAU;QAC7D,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AACzB,QAAA,MAAM,GAAG,GAAG,OAAQ,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;AAC1D,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACvD;AAEA;;;;AAIG;IACH,MAAM,GAAA;QACJ,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEQ,IAAA,MAAM,GAAG,GAAA;AACf,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;;AAEtB,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AACzB,QAAA,IAAI,EAAW;QACf,IAAI,QAAQ,GAAG,KAAK;AACpB,QAAA,IAAI;;AAEF,YAAA,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK;QAC3C;AAAE,QAAA,MAAM;YACN,EAAE,GAAG,KAAK;YACV,QAAQ,GAAG,IAAI;QACjB;QACA,IAAI,EAAE,EAAE;AACN,YAAA,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;QACjC;AAAO,aAAA,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;;YAE1C,IAAI,CAAC,aAAa,EAAE;QACtB;AACA,QAAA,OAAO,EAAE;IACX;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC;AACjC,YAAA,KAAK,EAAE,qBAAqB;YAC5B,eAAe,EAAE,SAAS,CAAC,MAAM;AACjC,YAAA,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY;AAC3C,YAAA,mBAAmB,EAAE,IAAI;AAC1B,SAAA,CAAC;IACJ;+GA9DW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA,CAAA;;4FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC1BlC;AACO,MAAM,mBAAmB,GAAG;AACjC,IAAA,UAAU,EAAE,WAAW;;AAEvB,IAAA,aAAa,EAAE,gBAAgB;AAC/B,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,SAAS,EAAE,SAAS;;AAEpB,IAAA,IAAI,EAAE,OAAO;;AAEb,IAAA,OAAO,EAAE,cAAc;;AAEvB,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,OAAO,EAAE,OAAO;;AAEhB,IAAA,GAAG,EAAE,KAAK;;AAEV,IAAA,QAAQ,EAAE,SAAS;AACnB;AAC0D;AAC1D,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,KAAK,EAAE,OAAO;;AAGhB;AACO,MAAM,sBAAsB,GAAqC;AACtE,IAAA,CAAC,mBAAmB,CAAC,QAAQ,GAAG,mBAAmB,CAAC,GAAG;;AAGzD;AACM,SAAU,sBAAsB,CAAC,OAAe,EAAA;;AAEpD,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,OAAO,CAAC,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,OAAO;AACnG;MAgBa,uBAAuB,GAAG,IAAI,cAAc,CAAyB,yBAAyB;AAE3G;AAC6D;AACvD,SAAU,sBAAsB,CAAC,OAA6B,EAAA;AAClE,IAAA,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7E;AAEA;MAEa,oBAAoB,CAAA;AADjC,IAAA,WAAA,GAAA;AAEW,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;;AAEtB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,EAAE,8EAAC;AAgB9B,IAAA;;IAbC,IAAI,CAAC,OAAO,GAAG,EAAE,EAAA;QACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;IAEA,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,KAAK,EAAE;;YAC1B,IAAI,CAAC,IAAI,EAAE;IAClB;+GAlBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA,CAAA;;4FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC5BlC;AACA,MAAM,aAAa,GAAsB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAA,EAAA,EAAK,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;AAC1F;AACA,MAAM,qBAAqB,GAAG,OAAO;AAErC;;;;;;;;;;;;AAYG;MAEU,eAAe,CAAA;AAD5B,IAAA,WAAA,GAAA;QAEU,IAAA,CAAA,OAAO,GAAoB,EAAE;QAC7B,IAAA,CAAA,QAAQ,GAAmB,EAAE;AACpB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACtC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACtC,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC;AAC7B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;;AAGxC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,OAAO,EAAQ;;AAG1B,QAAA,IAAA,CAAA,GAAG,GAAG,IAAI,GAAG,EAA4C;AA0B1E;;;;AAIG;AACa,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAgC,MAAK;AACxE,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AACjD,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACxC,gBAAA,IAAI,CAAC,QAAQ;AAAE,oBAAA,OAAO,IAAI;gBAC1B,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,aAAa,GAAG,qBAAqB,GAAG,IAAI,CAAC,IAAI,EAAE;AACpH,YAAA,CAAC,CAAC;AACF,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;;AAElC,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5D,QAAA,CAAC,iFAAC;AAiFH,IAAA;;IAtHS,WAAW,GAAA;AACjB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI;QACnB,OAAO;AACL,YAAA,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACvG,YAAA,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;AAChH,YAAA,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;AAC/I,YAAA,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC7I,YAAA,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE;AACvJ,YAAA,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzI,YAAA,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE;SAChG;IACH;;IAGQ,WAAW,GAAA;AACjB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI;QACnB,OAAO;AACL,YAAA,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE;AACjE,YAAA,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;AAChF,YAAA,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;SAC/D;IACH;AAkBA;;;;AAIG;AACH,IAAA,IAAW,SAAS,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;YACtC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,YAAA,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,SAAA,CAAC,CAAC;IACL;AAEA;;;AAGG;IACI,MAAM,GAAA;AACX,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS;AAC1B,QAAA,OAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS;AACxC,aAAA,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC;AAC/F,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAClC;;AAGA,IAAA,UAAU,CAAC,OAAwB,EAAA;AACjC,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE;AAC9C,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE;AAC1B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,KAAI;;YAErE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;AACvC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC/E,YAAA,OAAO,MAAK;AACV,gBAAA,MAAM,EAAE;gBACR,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;AAClC,YAAA,CAAC;AACH,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;;;AAKQ,IAAA,IAAI,CAAC,EAAe,EAAA;AAC1B,QAAA,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,KAAK;AACrB,QAAA,EAAE,EAAE;AACJ,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,QAAQ,CAAC,GAAW,EAAA;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,QAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF;;AAGQ,IAAA,YAAY,CAAC,KAAoB,EAAA;AACvC,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC5F,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QACxB,IAAI,GAAG,GAAkB,IAAI;AAC7B,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC;YAC9G,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI;AAChE,YAAA,GAAG,GAAG,GAAG,EAAE,QAAQ,KAAK,OAAO,GAAG,EAAE,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;QAChG;AAAE,QAAA,MAAM,gCAAgC;AACxC,QAAA,OAAO,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK;IACzC;;AAGQ,IAAA,QAAQ,CAAC,IAAgC,EAAA;QAC/C,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,GAAG,EAAE,GAAG,KAAK;QACxD,OAAO,IAAI,CAAC;aACT,MAAM,CAAC,IAAI;AACX,aAAA,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA,CAAA,CAAG,CAAC;AAC7F,aAAA,IAAI,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,CAAG,CAAC;IACpB;+GApIW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA,CAAA;;4FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAwIlC,SAAS,YAAY,CAAC,KAAyB,EAAA;AAC7C,IAAA,OAAO,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,SAAS;AAC1E;;AC/JA,MAAM,iBAAiB,GAAG,CAAC;MAad,eAAe,CAAA;;AAmB1B,IAAA,IAAY,eAAe,GAAA;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAuB,CAAC,cAAc,CAAC;IACrE;AAEA,IAAA,WAAA,CACU,WAAiC,EAC/B,YAA0B,EAC1B,kBAAsC,EACtC,cAA8B,EAChC,WAAwB,EACxB,MAAc,EACd,UAA6B,EAC7B,SAA0B,EACA,MAA0B,EAAA;QARpD,IAAA,CAAA,WAAW,GAAX,WAAW;QACT,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,kBAAkB,GAAlB,kBAAkB;QAClB,IAAA,CAAA,cAAc,GAAd,cAAc;QAChB,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,SAAS,GAAT,SAAS;AA7BZ,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,CAAC,QAAQ,CAAC,iBAAiB;AAC3C,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,eAAe;QAClC,IAAA,CAAA,aAAa,GAAG,KAAK;AAC5B;AAC+E;QACxE,IAAA,CAAA,SAAS,GAAkB,IAAI;AAIrB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACzB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM;QACpC,IAAA,CAAA,GAAG,GAAG,aAAa;AACrB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACvC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACtC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAoJpD,IAAA,CAAA,UAAU,GAAG,EAAE;QACf,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,YAAY,GAAgB,EAAE;QAC9B,IAAA,CAAA,WAAW,GAAG,CAAC;QACd,IAAA,CAAA,UAAU,GAAgB,EAAE;;QAE7B,IAAA,CAAA,cAAc,GAAgB,EAAE;;QAEhC,IAAA,CAAA,aAAa,GAAG,KAAK;QA3I1B,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,QAAQ;;;QAG1C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IACpC;AAEA,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;AAC7C,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAS,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;;;;;;;;;;;QAY7E,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,MAAK;AAC5C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW;YAC9C,IAAI,CAAC,WAAW,CAAC;AACd,iBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,KAAK,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACjD,iBAAA,SAAS,CAAC,CAAC,IAAS,KAAI;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC/D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,IAAI,gBAAgB,CAAC,CAAC;AACxD,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE;IACzC;AAEA,IAAA,UAAU,CAAC,IAAS,EAAA;AAClB,QAAA,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;IAClD;;AAGQ,IAAA,kBAAkB,CAAC,MAAe,EAAA;AACxC,QAAA,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,EAAE;AAC5B,YAAA,IAAI,CAAC,CAAC;gBAAE;YACR,IAAI,CAAC,CAAC,cAAc;gBAAE,OAAO,CAAC,CAAC,cAAc;AAC7C,YAAA,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE;gBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAiB,CAAC;AAC1D,gBAAA,IAAI,KAAK;AAAE,oBAAA,OAAO,KAAK;YACzB;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,QAAQ,CAAC,KAAuB,EAAA;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;IACnC;IAEA,UAAU,GAAA,EAAK,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC;AACpD,IAAA,IAAI,gBAAgB,GAAA,EAAc,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAEzF,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;AAC/B,YAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB;AAC3B,iBAAA,IAAI,CAAC,MAAK,EAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC;AACxC,iBAAA,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA,2BAAA,EAA8B,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC,CAAC;QAC7E;aAAO;YACL,QAAQ,CAAC,cAAc;AACpB,iBAAA,IAAI,CAAC,MAAK,EAAG,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC;AACzC,iBAAA,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA,4BAAA,EAA+B,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC,CAAC;QAC9E;IACF;IAEA,IAAI,KAAK,GAAA,EAAK,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,MAAM,GAAA,EAAK,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,OAAO,GAAA,EAAkB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAE9D,MAAM,WAAW,CAAC,WAAmB,EAAA;QACnC,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;IACjD;;IAGA,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;IACpC;;IAGA,SAAS,GAAA,EAAK,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;;IAGzC,aAAa,GAAA,EAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAE/C;AAC6F;AAC7F,IAAA,IAAI,gBAAgB,GAAA;QAClB,MAAM,KAAK,GAAe,EAAE;;;QAG5B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,EAAE,EAAE,QAAQ;AACZ,gBAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;AAC7B,gBAAA,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAA,MAAA,EAAS,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AAClI,aAAA,CAAC;QACJ;AACA,QAAA,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxG,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;QAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC7E,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;AAE/D,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;AAEvF,QAAA,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;AACjJ,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,mBAAmB,CAAC,EAAU,EAAA;AAC5B,QAAA,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AAAE,YAAA,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAE;QAAQ;QACzF,QAAQ,EAAE;AACR,YAAA,KAAK,MAAM;gBAAE,IAAI,CAAC,SAAS,EAAE;gBAAE;AAC/B,YAAA,KAAK,MAAM;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBAAE;AAClC,YAAA,KAAK,WAAW;gBAAE,IAAI,CAAC,aAAa,EAAE;gBAAE;AACxC,YAAA,KAAK,UAAU;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAAE;;AAEvC,YAAA,KAAK,OAAO;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;gBAAE;AAClE,YAAA,KAAK,QAAQ;AAAE,gBAAA,KAAK,IAAI,CAAC,MAAM,EAAE;gBAAE;;IAEvC;;IAeQ,aAAa,CAAC,MAAe,EAAE,KAAe,EAAA;AACpD,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,GAAG,GAAgB,EAAE;AAC3B,QAAA,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,EAAE;AAC5B,YAAA,IAAI,CAAC,CAAC;gBAAE;AACR,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,kBAAkB,IAAI,EAAE;AACvC,YAAA,IAAI,CAAC,CAAC,cAAc,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAoB,CAAC,EAAE;AACjE,gBAAA,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9G;AACA,YAAA,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM;AAAE,gBAAA,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAiB,EAAE,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC7G;AACA,QAAA,OAAO,GAAG;IACZ;AAEA;;AAEyF;IACzF,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,IAAI,CAAC,aAAa,EAAE;;;;QAIpB,eAAe,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACnH;;AAGA,IAAA,sBAAsB,CAAC,IAAa,EAAA;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC5B;IACF;IAEA,aAAa,GAAA;AACX,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;AACtD,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;;;QAGpB,IAAI,CAAC,CAAC,EAAE;AACN,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE;AACvC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACnD;QACF;AACA,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACtB,aAAA,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACpF,aAAA,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3E,aAAA,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAChB;AAEA,IAAA,OAAO,CAAC,IAAe,EAAA;QACrB,IAAI,CAAC,IAAI,EAAE,QAAQ;YAAE;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC1C;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM;YAAE;QAC/B,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;IACrG;;AAGQ,IAAA,QAAQ,CAAC,GAAW,EAAA;AAC1B,QAAA,IAAI;AAAE,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;QAAE;AACjG,QAAA,MAAM;AAAE,YAAA,OAAO,EAAE;QAAE;IACrB;IAEQ,UAAU,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe;AACtC,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,IAAI,CAAC,EAAE,IAAI;AACpC,aAAA,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;AACtG,aAAA,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC;IAChC;AACQ,IAAA,UAAU,CAAC,IAAe,EAAA;AAChC,QAAA,MAAM,KAAK,GAAc,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE;AAC9H,QAAA,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC;AACrH,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI;AAAE,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAAE;AAAE,QAAA,MAAM,mCAAmC;IACrH;AACA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,KAAK,EAAE,cAAc,EAAE;QACvB,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AACxB,QAAA,IAAI;AAAE,YAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;QAAE;AAAE,QAAA,MAAM,aAAa;AAC1E,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;IACxB;AA5QW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,mQAgCJ,YAAY,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAhCvB,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1C5B,gpIA6EA,EAAA,MAAA,EAAA,CAAA,81EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3CI,YAAY,kIAAE,WAAW,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,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,EACzBC,iBAAqB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,EAAA,MAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,KAAA,EAAA,KAAA,EAAA,MAAA,EAAA,aAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,+GAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtI,oBAAoB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAMhC,eAAe,EAAA,UAAA,EAAA,CAAA;kBAX3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EACf;AACP,wBAAA,YAAY,EAAE,WAAW;wBACzBA,iBAAqB,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,cAAc;AACtI,wBAAA,oBAAoB,EAAE,mBAAmB;qBAC1C,EAAA,eAAA,EAEgB,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,gpIAAA,EAAA,MAAA,EAAA,CAAA,81EAAA,CAAA,EAAA;;0BAmC3C;;0BAAY,MAAM;2BAAC,YAAY;;sBAoIjC,SAAS;uBAAC,UAAU;;;AEhMvB,MAAM,SAAS,GAAG,OAAO;AAEzB;;;;;;AAMG;MAEU,wBAAwB,CAAA;AA0BnC,IAAA,WAAA,GAAA;AAzBiB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAEzC,IAAA,CAAA,KAAK,GAAmB,6BAA6B,CAC5D,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EACvD,CAAC,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EACpD,MAAM,CAAC,mCAAmC,CAAC,CAC5C;QAEgB,IAAA,CAAA,KAAK,GAAG,MAAM,CAAiB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC7D,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,2EAAC;AACxC,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,cAAc,qFAAC;AAErE;;;AAGgD;AACvC,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAiB,MAAK;AACpD,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,YAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,QAAQ;AAClE,YAAA,OAAO,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI;AAClD,QAAA,CAAC,mFAAC;QAEM,IAAA,CAAA,aAAa,GAAG,EAAE;AAGxB,QAAA,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAE9C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AACrC,YAAA,IAAI,EAAE,KAAK,YAAY,aAAa,CAAC;gBAAE;AACvC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS;AAClE,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;YACzB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AACjG,QAAA,CAAC,CAAC;;;;QAKF,IAAI,KAAK,GAAG,IAAI;QAChB,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,YAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,QAAQ;YAClE,IAAI,KAAK,EAAE;gBACT,KAAK,GAAG,KAAK;gBACb;YACF;AACA,YAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,aAAa;gBAAE;AAClD,YAAA,IAAI,CAAC,aAAa,GAAG,QAAQ;YAC7B,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC1C,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAG8F;AACtF,IAAA,QAAQ,CAAC,GAAW,EAAA;QAC1B,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;AACjE,QAAA,OAAO,0BAA0B,CAC/B,aAAa,EACb,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EACnC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,EACtD,GAAG,CACJ;IACH;AAEA,IAAA,MAAM,CAAC,GAAW,EAAA;AAChB,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO;AACL,YAAA,EAAE,EAAE,IAAI;AACR,YAAA,KAAK,EAAE,IAAI,EAAE,kBAAkB,IAAI,IAAI;AACvC,YAAA,IAAI,EAAE,IAAI,EAAE,UAAU,IAAI,SAAS;SACpC;IACH;;AAGA,IAAA,UAAU,CAAC,OAAe,EAAA;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACrD;AAEA;AACqE;IACrE,eAAe,CAAC,OAAe,EAAE,IAAY,EAAA;AAC3C,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1D;+GAtFW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA,CAAA;;4FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACZlC;;;;;;;AAOG;AACH,SAAS,aAAa,CAAC,KAAY,EAAA;IACjC,OAAO;;QAEL,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS;AACxC,QAAA,KAAK,EAAE,KAAK,CAAC,kBAAkB,IAAI,EAAE;AACrC,QAAA,IAAI,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS;AACnC,QAAA,KAAK,EAAE,KAAK,CAAC,cAAc,IAAI,EAAE;AACjC,QAAA,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,aAAa,CAAC;KAClD;AACH;AAEA;;;;;;;;;;;;;;;;AAgBG;MA8EU,gBAAgB,CAAA;AA4C3B,IAAA,WAAA,GAAA;AA3CmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO;QACrC,IAAA,CAAA,GAAG,GAAG,aAAa;AACrB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC5C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC1C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;;AAGlC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAW,EAAE,2EAAC;AAE7B,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;AACtH;;;AAG8B;AACX,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAgB,MAAK;;YAExD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAChD,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM;AAAE,gBAAA,OAAO,EAAE;AAChF,YAAA,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;AAClC,QAAA,CAAC,8EAAC;AAEiB,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAe,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,oFAAC;;QAGxF,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAgB,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,aAAa,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEjH;;;AAGgF;QAC7D,IAAA,CAAA,wBAAwB,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,0BAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAE7G;;AAE8B;AACb,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAC1B,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,qFAAC;AAE3G;AAC0F;QACvE,IAAA,CAAA,QAAQ,GAAG,QAAQ;AAGpC,QAAA,KAAK,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CACnE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EACjC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CACxB;;;;;AAMD,QAAA,IAAI,YAAuC;QAC3C,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,MAAM,EAAE,GAAG,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI;AACjE,YAAA,IAAI,EAAE,KAAK,YAAY,EAAE;gBACvB,YAAY,GAAG,EAAE;AACjB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC9B;AACF,QAAA,CAAC,CAAC;;;;;;;;AASF,QAAA,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CACxB,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,aAAa,IAAI,CAAC,YAAY,iBAAiB,CAAC,EACzE,kBAAkB,EAAE,CACrB,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjD;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;+GA/EW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5H7B,w7DAoCA,EAAA,MAAA,EAAA,CAAA,++BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDaY,YAAY,mIAAEC,kBAAsB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA2ExE,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBA7E5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAChB,CAAC,YAAY,EAAEA,kBAAsB,EAAE,oBAAoB,EAAE,aAAa,CAAC,EAAA,eAAA,EAEnE,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w7DAAA,EAAA,MAAA,EAAA,CAAA,++BAAA,CAAA,EAAA;;;AEnDjD;AACA;AAoBA;AACO,MAAM,iBAAiB,GAAG,CAAC;AAClC;AACO,MAAM,aAAa,GAAG,EAAE;AAC/B;AACO,MAAM,SAAS,GAAG,EAAE;AAC3B;AACO,MAAM,eAAe,GAAG,GAAG;AAClC;AACO,MAAM,sBAAsB,GAAG,GAAG;AAEzC;SACgB,aAAa,CAAC,MAAgB,EAAE,OAAO,GAAG,iBAAiB,EAAA;IACzE,OAAO;AACL,QAAA,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,OAAO;AACzB,QAAA,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,OAAO;AAC3B,QAAA,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,OAAO,GAAG,CAAC;AACjC,QAAA,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,CAAC;KACpC;AACH;AAEA;AACM,SAAU,aAAa,CAAC,KAAa,EAAE,QAAkB,EAAA;IAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;AACrE;AAEA;AACA,SAAS,UAAU,CAAC,KAAa,EAAE,IAAY,EAAE,IAAY,EAAA;AAC3D,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;AACtE;AAEA;;;;AAIG;SACa,aAAa,CAAC,IAAqB,EAAE,IAAc,EAAE,QAAkB,EAAA;IACrF,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC;AACjD,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC;AACrE,IAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC;AACpE,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;AAEtE,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;AACzD,IAAA,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;IAEzD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,aAAa;IACpD,IAAI,KAAK,GAAG,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;IAE/F,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,aAAa,GAAG,MAAM;IAC/C,IAAI,KAAK,IAAI,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;IAEpE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,aAAa;IACpD,IAAI,KAAK,GAAG,KAAK,IAAI,QAAQ,CAAC,KAAK,GAAG,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;IAE7F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,aAAa,GAAG,KAAK;IAClD,IAAI,QAAQ,IAAI,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;IAE1E,OAAO;QACL,GAAG,EAAE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;QACnD,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;AACnD,QAAA,QAAQ,EAAE,KAAK;KAChB;AACH;;AC7DA;;;;AAIG;MAQU,0BAA0B,CAAA;AAmBrC,IAAA,WAAA,CAAoB,UAA6B,EAAA;QAA7B,IAAA,CAAA,UAAU,GAAV,UAAU;AAlBX,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI;QAClC,IAAA,CAAA,GAAG,GAAG,aAAa;QAG/B,IAAA,CAAA,IAAI,GAA0B,IAAI;QAClC,IAAA,CAAA,KAAK,GAAG,CAAC;QACT,IAAA,CAAA,KAAK,GAAG,CAAC;;QAGT,IAAA,CAAA,IAAI,GAAe,IAAI;;AAEvB,QAAA,IAAA,CAAA,IAAI,GAAqD,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AAIlF,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEQ;IAEpD,IAAI,OAAO,GAAA,EAAc,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,MAAM,GAAA,EAAc,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAEvD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,KAAI;;;AAGpD,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;YACvB,IAAI,CAAC,GAAG,EAAE;AAAE,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAAE,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI;gBAAE;YAAQ;AACxD,YAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI;AACpB,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK;AACtB,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK;YACtB,IAAI,CAAC,MAAM,EAAE;AACf,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;IAC5B;;IAGQ,MAAM,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;AACtB,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI;AAC/D,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AACtC,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,GAAG,IAAI;QACzE,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5F,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA;;;AAGG;IACK,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,eAAe,CAC/B;YACE,IAAI,EAAE,MAAK;gBACT,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,YAAY,IAAI,CAAC;AAC5D,gBAAA,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;oBAAE;gBAC3B,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7E,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;AAC5B,oBAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,oBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;gBACzB;YACF,CAAC;SACF,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;IACH;;AAGQ,IAAA,aAAa,CAAC,MAAmB,EAAA;AACvC,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC3C,QAAA,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW;YAAE;;AAExD,QAAA,MAAM,IAAI,GAAG,oBAAoB,EAAE;QACnC,MAAM,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;IACnG;;AAGQ,IAAA,QAAQ,CAAC,MAAc,EAAA;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,WAAW,IAAI,CAAC;QAC7D,OAAO,EAAE,KAAK,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,EAAE;IACvD;IAEQ,QAAQ,GAAA;AACd,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;IACjE;AAEQ,IAAA,YAAY,CAAC,IAAsB,EAAA;AACzC,QAAA,OAAO,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;IAC3G;IAIA,gBAAgB,GAAA;QACd,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,MAAM,EAAE;IAC9B;;IAGA,IAAI,GAAA,EAAW,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,IAAI,GAAA,EAAW,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,IAAI,GAAA,EAAW,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;+GA3G9B,0BAA0B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,CAAA,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnCvC,kzCA6BA,EAAA,MAAA,EAAA,CAAA,sxCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDCY,YAAY,mIAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAK5B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;+BACE,0BAA0B,EAAA,OAAA,EAC3B,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,eAAA,EAEvB,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,kzCAAA,EAAA,MAAA,EAAA,CAAA,sxCAAA,CAAA,EAAA;;sBAM7C,SAAS;uBAAC,QAAQ;;sBA+FlB,YAAY;uBAAC,eAAe;;sBAC5B,YAAY;uBAAC,eAAe;;;AExH/B,MAAM,cAAc,GAAgB;AAClC,IAAA,UAAU,EAAE,SAAS;AACrB,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,WAAW,EAAE,SAAS;AACtB,IAAA,KAAK,EAAE,SAAS;AAChB,IAAA,IAAI,EAAE,YAAY;CACnB;AAEK,SAAU,eAAe,CAAC,GAAa,EAAA;IAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS;IAChF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,QAAgB,KAAK,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,QAAQ;IACzG,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,qBAAqB,EAAE,cAAc,CAAC,UAAU,CAAC;QAClE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC;QAC9C,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,KAAK,CAAC;QACjD,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,WAAW,CAAC;QAC7D,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,KAAK,CAAC;AAC9C,QAAA,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,cAAc,CAAC,IAAI;KAC9D;AACH;AAEA,MAAM,YAAY,GAA2B,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE;AAErH,SAAS,GAAG,CAAC,KAAa,EAAA;AACxB,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;AAC5D;AAEA,MAAM,KAAK,GAAG,GAAG;AACjB,MAAM,MAAM,GAAG,GAAG;AAClB,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC;AACpB,MAAM,EAAE,GAAG,GAAG;AAEd;AACA,SAAS,IAAI,CAAC,KAAa,EAAE,CAAS,EAAE,CAAS,EAAE,IAAY,EAAE,KAAa,EAAA;IAC5E,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,OAAO,CACjC,SAAS,EACT,CAAA,QAAA,EAAW,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,SAAA,EAAY,IAAI,CAAA,UAAA,EAAa,IAAI,CAAA,SAAA,EAAY,GAAG,CAAC,KAAK,CAAC,CAAA,CAAA,CAAG,CAChF;AACH;AAEA;AACA,SAAS,OAAO,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,OAAe,EAAA;AAC9E,IAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI;AAClB,IAAA,MAAM,CAAC,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,GAAG,CAAC,GAAG;IAC3J,OAAO,CAAA,SAAA,EAAY,CAAC,CAAA,QAAA,EAAW,GAAG,CAAC,KAAK,CAAC,CAAA,WAAA,EAAc,OAAO,CAAA,GAAA,CAAK;AACrE;AAEA,SAAS,KAAK,CAAC,CAAS,EAAA;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;AAChC;AAEM,SAAU,qBAAqB,CAAC,YAAmC,EAAE,OAAoB,EAAA;AAC7F,IAAA,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,IAAI,EAAE;AAChD,IAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;AACtC,IAAA,MAAM,CAAC,GAAG;AACR,QAAA,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;AAC3B,QAAA,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AACzB,QAAA,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;AACzB,QAAA,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;AAChC,QAAA,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;KAC1B;IAED,MAAM,UAAU,GAAG,QAAQ,GAAG,EAAE,GAAG,EAAE;IACrC,MAAM,QAAQ,GAAG,QAAQ,GAAG,EAAE,GAAG,GAAG;AACpC,IAAA,MAAM,KAAK,GAAa,CAAC,CAAA,aAAA,EAAgB,KAAK,CAAA,UAAA,EAAa,MAAM,CAAA,gBAAA,EAAmB,CAAC,CAAC,EAAE,CAAA,GAAA,CAAK,CAAC;IAE9F,IAAI,QAAQ,EAAE;AACZ,QAAA,KAAK,CAAC,IAAI,CACR,CAAA,aAAA,EAAgB,EAAE,CAAA,MAAA,EAAS,EAAE,CAAA,wCAAA,EAA2C,CAAC,CAAC,MAAM,CAAA,wFAAA,CAA0F,CAC3K;IACH;SAAO;AACL,QAAA,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAA,MAAA,EAAS,EAAE,GAAG,CAAC,QAAQ,UAAU,GAAG,EAAE,CAAA,QAAA,EAAW,CAAC,CAAC,MAAM,CAAA,iBAAA,CAAmB,CAAC;IAC3G;IAEA,KAAK,CAAC,IAAI,CACR,CAAA,YAAA,EAAe,EAAE,CAAA,MAAA,EAAS,EAAE,CAAA,KAAA,EAAQ,UAAU,CAAA,QAAA,EAAW,CAAC,CAAC,KAAK,CAAA,UAAA,EAAa,CAAC,CAAC,MAAM,CAAA,oBAAA,CAAsB,EAC3G,CAAA,YAAA,EAAe,EAAE,CAAA,MAAA,EAAS,EAAE,CAAA,KAAA,EAAQ,UAAU,GAAG,EAAE,CAAA,QAAA,EAAW,CAAC,CAAC,MAAM,kBAAkB,EACxF,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,GAAG,CAAC,EAAE,EAAE,GAAG,QAAQ,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EACrF,OAAO,CAAC,EAAE,GAAG,UAAU,GAAG,EAAE,EAAE,EAAE,GAAG,UAAU,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAC1E,OAAO,CAAC,EAAE,GAAG,UAAU,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CACzE;IAED,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;;QAE5B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,UAAU,CAAC,MAAM;AACrE,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3C,QAAA,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3C,QAAA,KAAK,CAAC,IAAI,CACR,CAAA,wBAAA,EAA2B,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,yCAAA,EAA4C,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,GAAA,CAAK,EACvG,CAAA,qBAAA,EAAwB,CAAC,CAAC,KAAK,CAAA,UAAA,EAAa,CAAC,CAAC,MAAM,sBAAsB,EAC1E,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,EAC1C,CAAA,uDAAA,EAA0D,CAAC,CAAC,KAAK,CAAA,EAAA,EAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA,OAAA,CAAS,EAC7F,CAAA,QAAA,CAAU,CACX;AACH,IAAA,CAAC,CAAC;;;AAIF,IAAA,MAAM,MAAM,GAAG,OAAO,QAAQ,KAAK,WAAW,GAAG,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC;AACxG,IAAA,MAAM,KAAK,GAAG,QAAQ,IAAI,MAAM,KAAK;AACnC,UAAE,kEAAkE;YAClE,iFAAiF;aAChF,MAAM,KAAK,MAAM,GAAG,EAAE,GAAG,8DAA8D,CAAC;YACzF;UACA,EAAE;IAEN,MAAM,GAAG,GACP,CAAA,qDAAA,EAAwD,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,SAAA,EAAY,KAAK,CAAA,UAAA,EAAa,MAAM,CAAA,EAAA,CAAI;AAC/G,QAAA,CAAA,aAAA,EAAgB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,EAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ;AACtE,IAAA,OAAO,sBAAsB,kBAAkB,CAAC,GAAG,CAAC,EAAE;AACxD;;ACvHA;;;AAGG;MAgBU,kBAAkB,CAAA;AAf/B,IAAA,WAAA,GAAA;AAgBqB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI;AACpC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAE5C;AACoF;AACjE,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AACxC,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAAE,gBAAA,OAAO,EAAE;YAClC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC9C,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;gBACpC,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,YAAY,GAAG,qBAAqB,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;;AAExF,gBAAA,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE;AAClC,aAAA,CAAC,CAAC;AACL,QAAA,CAAC,6EAAC;AACH,IAAA;+GAlBY,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAXnB;;;;;;;;;AAST,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAXS,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAajD,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAf9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,OAAO,EAAE,CAAC,cAAc,EAAE,iBAAiB,EAAE,eAAe,CAAC;oBAC7D,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,QAAQ,EAAE;;;;;;;;;AAST,EAAA,CAAA;AACF,iBAAA;;;ACjBD;;;;;AAKG;MAQU,4BAA4B,CAAA;AAPzC,IAAA,WAAA,GAAA;QAQS,IAAA,CAAA,IAAI,GAAG,KAAK;AACA,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;AACzC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAEpC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU;;AAEjC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,aAAa;AA+B/E,IAAA;;AA7BC,IAAA,IAAc,SAAS,GAAA;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;IACtC;;AAGA,IAAA,IAAW,MAAM,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;IAChC;;AAGA,IAAA,KAAK,CAAC,IAAY,EAAA;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7D;;IAKA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK;AACjB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;IAC3B;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE;IACzB;+GAtCW,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,sFCpBzC,2rBAeA,EAAA,MAAA,EAAA,CAAA,u3BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDAY,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,yTAAE,qBAAqB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAKrD,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;+BACE,4BAA4B,EAAA,OAAA,EAC7B,CAAC,cAAc,EAAE,eAAe,EAAE,qBAAqB,CAAC,EAAA,eAAA,EAEhD,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,2rBAAA,EAAA,MAAA,EAAA,CAAA,u3BAAA,CAAA,EAAA;;;AEqEhD;;;;AAIG;AACG,SAAU,eAAe,CAAC,SAAoC,EAAE,KAAgC,EAAA;AACpG,IAAA,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE;AAC7B,IAAA,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;AAAE,QAAA,OAAO,IAAI;AAClH,IAAA,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA,YAAA,EAAe,kBAAkB,CAAC,OAAO,CAAC,UAAU;AACpG;AAEA;;;;;;AAMG;MAEU,2BAA2B,CAAA;AADxC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;QACnC,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAExD,QAAA,IAAA,CAAA,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AACvE,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO;AAqFpC,IAAA;IAnFC,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;IACtC;AAEA,IAAA,cAAc,CAAC,KAAoB,EAAA;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC;IAC5C;AAEA,IAAA,iBAAiB,CAAC,QAAgB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtE;IAEA,SAAS,CAAC,QAAgB,EAAE,KAAc,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC9G;IAEA,QAAQ,CAAC,QAAgB,EAAE,IAAY,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1E;AAEA,IAAA,MAAM,CAAC,QAAgB,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IAClE;IAEA,uBAAuB,GAAA;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,CAAC;IACjD;IAEA,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;IACtC;AAEA,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA,UAAA,EAAa,kBAAkB,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;IACpE;IAEA,gBAAgB,GAAA;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAChD;;IAGA,QAAQ,CAAC,SAA8E,EAAE,EAAA;AACvF,QAAA,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE;QACnC,IAAI,MAAM,CAAC,KAAK;AAAE,YAAA,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,MAAM;AAAE,YAAA,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM;YAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;AACrD,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA,SAAA,EAAY,EAAE,GAAG,CAAA,CAAA,EAAI,EAAE,EAAE,GAAG,EAAE,CAAA,CAAE,CAAC;IAC3D;IAEA,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;IACpC;;AAGA,IAAA,eAAe,CAAC,OAAsB,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACnE;IAEA,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC;IACzC;;AAGA,IAAA,eAAe,CAAC,WAAoC,EAAA;AAClD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC;IAC1D;AAEQ,IAAA,MAAM,IAAI,CAAI,MAAyB,EAAE,IAAY,EAAE,IAAa,EAAA;AAC1E,QAAA,IAAI;YACF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;QAClD;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,EAAE,GAAG,YAAY,iBAAiB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,eAAe,CAAC;AAAE,gBAAA,MAAM,GAAG;AAChH,YAAA,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAC7B,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;QAC5C;IACF;AAEQ,IAAA,OAAO,CAAI,MAAyB,EAAE,IAAY,EAAE,IAAa,EAAA;QACvE,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACvH,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,aAAa,EAAE,CAAA,OAAA,EAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAA,CAAE,EAAE,CAAC;QAC1F,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,CAAA,CAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAClG;+GA1FW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cADd,MAAM,EAAA,CAAA,CAAA;;4FACnB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAgGlC;AACM,SAAU,gBAAgB,CAAC,GAAY,EAAA;AAC3C,IAAA,IAAI,EAAE,GAAG,YAAY,iBAAiB,CAAC;AAAE,QAAA,OAAO,EAAE;AAClD,IAAA,MAAM,IAAI,GAAI,GAAG,CAAC,KAAoC,EAAE,KAAK;IAC7D,OAAO,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,SAAS,GAAG,EAAE;AAC5E;;AClMA;AACA,MAAM,WAAW,GAAG,CAAC;AACrB;AACO,MAAM,+BAA+B,GAAG;AAC/C;AACA,MAAM,aAAa,GAAG,EAAE;AACxB;AACA,MAAM,gBAAgB,GAAG,IAAI;AA2B7B;;;;;;;;;;;;;AAaG;MAEU,8BAA8B,CAAA;AAgDzC,IAAA,WAAA,GAAA;QA/CiB,IAAA,CAAA,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAChD,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACzC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC7C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC7C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACxC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACzC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAC5B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACpC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC;;QAG9C,IAAA,CAAA,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,kBAAkB,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS;AACxG,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAgC,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,6EAAC;;AAE/E,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAc,IAAI,+EAAC;;AAGpC,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAA6B,MAAK;AAC5D,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW;YAC1B,OAAO;AACL,gBAAA,CAAC,EAAE,WAAW;AACd,gBAAA,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AAClC,gBAAA,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AACjC,gBAAA,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACnC,gBAAA,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;AAC7B,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AAC5B,gBAAA,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;AACtB,gBAAA,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;AACtB,gBAAA,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;AACxB,gBAAA,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;AAClB,gBAAA,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;AACxB,gBAAA,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;AACxB,gBAAA,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE;AAChC,gBAAA,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE;AAC5B,gBAAA,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE;AACxB,gBAAA,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;AAC/B,gBAAA,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE;AAClC,gBAAA,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;aACvF;AACH,QAAA,CAAC,+EAAC;QAEM,IAAA,CAAA,MAAM,GAAG,KAAK;QACd,IAAA,CAAA,SAAS,GAAG,EAAE;QACd,IAAA,CAAA,KAAK,GAAyC,IAAI;QAClD,IAAA,CAAA,YAAY,GAAyB,IAAI;QAG/C,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QACpC,MAAM,CAAC,MAAK;YACV,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS;gBAAE;YAC7C,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAClC,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IACvD;AAEA;;AAEG;IACH,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;AAC5D,QAAA,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,IAAI,EAAE;QACjC,OAAO,IAAI,CAAC,YAAY;IAC1B;;IAGA,KAAK,CAAC,SAAS,GAAG,gBAAgB,EAAA;QAChC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,OAAO,CAAO,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACrG;;AAGA,IAAA,MAAM,OAAO,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE;YAC/B,MAAM,IAAI,CAAC,YAAY;YACvB;QACF;QACA,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE;IACnB;AAEQ,IAAA,MAAM,IAAI,GAAA;AAChB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1B,QAAA,IAAI;YACF,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;AACpD,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,IAAI;AACtD,YAAA,IAAI,MAAM;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AAC9B,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;YAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAC7B,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;;gBAE/B,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,QAAQ,EAAE;;AAC1D,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAChC;iBAAO;AACL,gBAAA,MAAM,IAAI,CAAC,IAAI,EAAE;YACnB;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAClB;IACF;;AAGQ,IAAA,KAAK,CAAC,GAA+B,EAAA;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW;AAC1B,QAAA,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;AACjG,QAAA,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE;AAC1D,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,GAAG,CAAC,MAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;AAClH,YAAA,IAAI,MAAM;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;QAC5C;AACA,QAAA,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;AACnG,QAAA,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;YAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,IAAkB,CAAC;QAC7G;AACA,QAAA,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzF,QAAA,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE;AAAE,YAAA,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AAClG,QAAA,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE;AAAE,YAAA,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AAClG,QAAA,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,EAAE;AAAE,YAAA,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;QACvG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE;AAAE,YAAA,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;AACpE,QAAA,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,EAAE;AAAE,YAAA,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AACjG,QAAA,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,EAAE;AAAE,YAAA,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AACjG,QAAA,IAAI,OAAO,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,GAAG,CAAC,aAAa,KAAK,CAAC,CAAC,aAAa,EAAE;AAAE,YAAA,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC;AAC5H,QAAA,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,EAAE;AAAE,YAAA,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC;AACjH,QAAA,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,EAAE;AAAE,YAAA,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;QACvG,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;AAAE,YAAA,CAAC,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;;QAE5G,IAAI,GAAG,CAAC,cAAc,KAAK,KAAK,IAAI,CAAC,CAAC,cAAc,EAAE;AAAE,YAAA,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAClF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AAChC,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS;AAC5B,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAM,CAAsB,EAAE,EAAE,CAAC,CAAC;YACnE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5E,YAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;QAC1D;IACF;IAEQ,QAAQ,GAAA;QACd,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzB,QAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,+BAA+B,CAAC;IAClF;AAEQ,IAAA,MAAM,IAAI,GAAA;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;AACxB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzB,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,GAAyC,CAAC;AACzE,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAClB;IACF;AAEQ,IAAA,MAAM,CAAC,GAAY,EAAA;;QAEzB,IAAI,GAAG,YAAY,iBAAiB,KAAK,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,EAAE;AACxG,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;YACnB;QACF;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;IAC1B;IAEQ,UAAU,GAAA;QAChB,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AACxC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;+GA7KW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,8BAA8B,cADjB,MAAM,EAAA,CAAA,CAAA;;4FACnB,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAD1C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAiLlC;AACM,SAAU,MAAM,CAAC,KAAc,EAAA;IACnC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAU,KAC5C,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC5C,UAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAA4B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;UACtG,CAAC,CAAC;AACV;AAEA,SAAS,KAAK,CAAC,KAAc,EAAA;IAC3B,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAQ,KAAyB,CAAC,CAAC,KAAK,QAAQ;AAC1H;;ACzOA,MAAM,QAAQ,GAAG,CAAC,KAAc,KAAY;AAC1C,IAAA,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IACvB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;AACxD,CAAC;AAED;AACM,SAAU,UAAU,CAAC,QAAmC,EAAA;AAC5D,IAAA,MAAM,MAAM,GAAG,QAAQ,EAAE,WAAW;AACpC,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;AACnE,IAAA,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AACjE,IAAA,IAAI,GAAG,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/D,IAAA,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG;QAAE,GAAG,GAAG,GAAG;AACtC,IAAA,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;;IAEnG,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACrE,IAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;AAC3F;AAEA;AACM,SAAU,oBAAoB,CAAC,MAAc,EAAE,MAAuB,EAAA;IAC1E,IAAI,CAAC,MAAM,CAAC,OAAO;AAAE,QAAA,OAAO,CAAC;AAC7B,IAAA,IAAI,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC;AACrC,IAAA,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,KAAK,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;AAAE,QAAA,OAAO,GAAG,MAAM,CAAC,GAAG;AAC/E,IAAA,IAAI,MAAM,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG;AAAE,QAAA,OAAO,GAAG,MAAM,CAAC,GAAG;AAC3E,IAAA,OAAO,OAAO;AAChB;;AChCA;AACO,MAAM,0BAA0B,GAAG;AAC1C;AACA,MAAM,cAAc,GAAG,KAAK;AAC5B,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAU;AAE3G;;;;;;;;;AASG;MAEU,gBAAgB,CAAA;AA2B3B,IAAA,WAAA,GAAA;QA1BiB,IAAA,CAAA,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAChD,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC7C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAC1C,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACjD,IAAA,CAAA,UAAU,GAAG,CAAA,OAAA,EAAU,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,KAAK,CAAA,cAAA,CAAgB;QAE7E,IAAA,CAAA,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;;QAE1C,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,8EAAC;;AAE3F,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;;AAEvB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,0BAA0B,kFAAC;AAEjD,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE;QACzB,IAAA,CAAA,SAAS,GAAG,CAAC;QACb,IAAA,CAAA,KAAK,GAA0C,IAAI;QACnD,IAAA,CAAA,QAAQ,GAAG,KAAK;;AAEP,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;QACtB,IAAA,CAAA,UAAU,GAAG,MAAK;YACjC,IAAI,IAAI,CAAC,OAAO,EAAE;gBAAE;YACpB,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC;QAGC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QACnB,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;gBAAE,IAAI,CAAC,GAAG,EAAE;;gBAC9C,IAAI,CAAC,IAAI,EAAE;AAClB,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IACjD;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB;;IAGA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAClB;;IAGA,SAAS,GAAA;AACP,QAAA,KAAK,IAAI,CAAC,MAAM,EAAE;IACpB;;IAGA,KAAK,CAAC,KAAK,GAAG,KAAK,EAAA;AACjB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG;QACvB,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,cAAc;YAAE;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;AACpB,QAAA,IAAI;AAAE,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QAAE;AAAE,QAAA,MAAM,6BAA6B;IACjG;;AAGA,IAAA,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAA;AACpB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ;YAAE;AAC/B,QAAA,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;AACrE,QAAA,MAAM,KAAK,GAAG,OAAO,GAAG,MAAM;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,0BAA0B,GAAG,IAAI,CAAC;AACrE,QAAA,IAAI,IAAI,IAAI,KAAK,EAAE;AACjB,YAAA,KAAK,IAAI,CAAC,MAAM,EAAE;QACpB;AAAO,aAAA,IAAI,IAAI,IAAI,MAAM,EAAE;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;gBACjB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC;AACnE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,CAAC,CAAC;QACJ;AAAO,aAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;;AAEzB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C;IACF;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC3D,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;QAC3C;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,CAAC;QACV;IACF;IAEQ,GAAG,GAAA;QACT,IAAI,IAAI,CAAC,KAAK;YAAE;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;YAC/B,KAAK,MAAM,IAAI,IAAI,eAAe;AAAE,gBAAA,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACtH,YAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC;AACpD,QAAA,CAAC,CAAC;IACJ;IAEQ,IAAI,GAAA;QACV,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AACzC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;QACjB,IAAI,IAAI,CAAC,OAAO;YAAE,KAAK,MAAM,IAAI,IAAI,eAAe;AAAE,gBAAA,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC5H,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;AAEQ,IAAA,MAAM,MAAM,GAAA;QAClB,IAAI,IAAI,CAAC,QAAQ;YAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC5C,QAAA,IAAI;YACF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;;AAE5C,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC3B;gBAAU;AACR,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QACvB;IACF;+GArHW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACDlC;;;;;;;;;;AAUG;MAEU,mBAAmB,CAAA;AADhC,IAAA,WAAA,GAAA;QAEmB,IAAA,CAAA,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAChD,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAClC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC7C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AACjC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO;AACpE,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,GAAG,EAAU;;AAGlC,QAAA,IAAA,CAAA,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM;;QAEvB,IAAA,CAAA,KAAK,GAA+B,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;;QAE5D,IAAA,CAAA,UAAU,GAAG,MAAM,CAAwB,IAAI,CAAC,cAAc,EAAE,iFAAC;;QAEjE,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS,oFAAC;AAgF9G,IAAA;;AA7EC,IAAA,SAAS,CAAC,MAAc,EAAA;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;QACrD,IAAI,OAAO,MAAM,KAAK,SAAS;AAAE,YAAA,OAAO,MAAM;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,cAAc,IAAI,IAAI;IACxE;IAEA,UAAU,CAAC,MAAc,EAAE,OAAgB,EAAA;QACzC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC;IACjD;AAEA;;;AAGG;AACH,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,aAAa,EAAE;AAC3C,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC;AAClC,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,UAAU,GAAG,YAAY,CAAC,UAAU;AACxC,QAAA,IAAI,UAAU,KAAK,SAAS,EAAE;AAC5B,YAAA,IAAI;AAAE,gBAAA,UAAU,GAAG,MAAM,YAAY,CAAC,iBAAiB,EAAE;YAAE;AAAE,YAAA,MAAM;gBAAE,UAAU,GAAG,QAAQ;YAAE;QAC9F;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/B,QAAA,MAAM,OAAO,GAAG,UAAU,KAAK,SAAS;AACxC,QAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,OAAO,CAAC;AAC3C,QAAA,OAAO,OAAO;IAChB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC3C;;IAGA,iBAAiB,GAAA;QACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;IAC5C;;IAGA,MAAM,CAAC,MAAc,EAAE,MAAmB,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC5G,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,YAAA,OAAO,CAAC,IAAI,CAAC,8EAA8E,MAAM,CAAA,CAAE,CAAC;QACtG;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,KAAK;AACzC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,SAAS;QAC7G,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,CAAA,EAAG,MAAM,CAAC,KAAK,CAAA,GAAA,EAAM,MAAM,CAAC,IAAI,CAAA,CAAE,GAAG,MAAM,CAAC,KAAK;AAC/E,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,EAAE,OAAO,EAAE;cAC9C,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;cACxF,SAAS,CAAC;AACd,QAAA,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC;AAChI,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,MAAM,CAAC,MAAc,EAAE,MAAmB,EAAE,GAAuB,EAAA;QACzE,IAAI,CAAC,iBAAiB,EAAE;AACxB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,SAAS;YAAE;AACrC,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,GAAG,MAAM,EAAE,CAAC;AAC3G,YAAA,KAAK,CAAC,OAAO,GAAG,MAAK;gBACnB,MAAM,CAAC,KAAK,EAAE;gBACd,KAAK,CAAC,KAAK,EAAE;AACb,gBAAA,IAAI,GAAG;AAAE,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACzB,YAAA,CAAC;QACH;AAAE,QAAA,MAAM;;QAER;IACF;AAEQ,IAAA,IAAI,CAAC,GAAW,EAAA;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACxE;IAEQ,cAAc,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,YAAY,KAAK,WAAW;AAAE,YAAA,OAAO,aAAa;QAC9E,OAAO,YAAY,CAAC,UAAU;IAChC;+GAhGW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA,CAAA;;4FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC1BlC;AACA,MAAM,OAAO,GAAG,kEAAkE;AAElF;AACM,SAAU,cAAc,CAAC,GAAY,EAAA;IACzC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;AACvG;AAEA;;;;;;AAMG;MAEU,qBAAqB,CAAA;AADlC,IAAA,WAAA,GAAA;QAEmB,IAAA,CAAA,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAChD,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC7C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC1C,QAAA,IAAA,CAAA,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS;QAC1E,IAAA,CAAA,QAAQ,GAAG,KAAK;AAwCzB,IAAA;;IArCC,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ;YAAE;AACrD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;AACxC,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC;AAChB,aAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,YAAY,aAAa,CAAC;AAClE,aAAA,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACpD;;AAGA,IAAA,QAAQ,CAAC,GAAW,EAAA;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE;AAC3G,QAAA,IAAI;AAAE,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC;QAAE;AAAE,QAAA,MAAM,6BAA6B;IAC5H;;IAGA,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AAC3C,QAAA,IAAI,MAAM,KAAK,MAAM,EAAE;YACrB,IAAI,GAAG,GAAkB,IAAI;AAC7B,YAAA,IAAI;AAAE,gBAAA,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;YAAE;AAAE,YAAA,MAAM;gBAAE,GAAG,GAAG,IAAI;YAAE;YAC5G,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI;QAC/D;AACA,QAAA,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAChG,YAAA,OAAO,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI;QACjF;AACA,QAAA,OAAO,IAAI;IACb;;IAGA,OAAO,eAAe,CAAC,SAAwB,EAAA;QAC7C,OAAO,CAAC,SAAS,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,OAAO;IACjE;+GA9CW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA,CAAA;;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACflC;AACA,MAAM,IAAI,GAAG,EAAE;AAEf;;;;AAIG;MAgDU,wBAAwB,CAAA;AAmBnC,IAAA,WAAA,GAAA;AAlBiB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACvC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AACjC,QAAA,IAAA,CAAA,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAE3C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAiB,EAAE,6EAAC;AACnC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAyB,EAAE,8EAAC;AAC5C,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,CAAC,4EAAC;AACjB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI,8EAAC;AACtB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AAEtB,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAA6B,MAAM;YAC5E,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YACxC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,EAAE;AACrD,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACiB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,8EAAC;AAGvI,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS;AAAE,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;AACpC,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;AAEU,IAAA,SAAS,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,GAAG,SAAS,GAAG,EAAE,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE;IACf;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,QAAA,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnB;IAEU,IAAI,GAAA;QACZ,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;IACvC;IAEQ,MAAM,IAAI,CAAC,MAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;AACjG,YAAA,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,EAAE;AACrC,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC3E,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC;AAC9C,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;QACxD;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;IAEU,SAAS,GAAA;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAgC;AAC7E,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;QAC7B,OAAO,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC;IACtF;AAEU,IAAA,WAAW,CAAC,CAAuB,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;IACpD;AAEU,IAAA,WAAW,CAAC,CAAuB,EAAA;QAC3C,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS,GAAG,QAAQ,GAAG,SAAS;IAC3F;AAEU,IAAA,MAAM,CAAC,CAAuB,EAAA;AACtC,QAAA,OAAQ,IAAI,CAAC,QAAQ,CAAC,OAAkC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;IAChF;AAEU,IAAA,MAAM,CAAC,CAAuB,EAAA;AACtC,QAAA,OAAQ,IAAI,CAAC,QAAQ,CAAC,OAAkC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;IAC5F;AAEU,IAAA,GAAG,CAAC,CAAuB,EAAA;QACnC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IACxF;AAEU,IAAA,MAAM,CAAC,CAAuB,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE;aACvJ,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACrF;+GAnFW,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,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5CzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAzCS,cAAc,qNAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,sJAAE,YAAY,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA6CtF,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA/CpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,OAAA,EACzB,CAAC,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,yBAAyB,EAAE,YAAY,CAAC,EAAA,QAAA,EACxF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA;;;AC9CjD;AACA,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;AAC1C,MAAM,MAAM,GAAG,CAAC,CAAmC,KAAK,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE;AACpF,MAAM,MAAM,GAAG,CAAC,CAAmC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM;AAC5E,MAAM,OAAO,GAAG,CAAC,CAAmC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO;AAC9E,MAAM,KAAK,GAAG,CAAC,CAAmC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK;AAEjF;;;;;;;;AAQG;MAEU,yBAAyB,CAAA;AAkCpC,IAAA,WAAA,GAAA;AAjCiB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,2BAA2B,CAAC;AAEjD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS;AAC9B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;;AAEvB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AACtB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAyB,IAAI,+EAAC;AAE/C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAc,MAAM,2EAAC;AAClC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAuB,IAAI,6EAAC;AAC3C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;;AAEpB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAuB,IAAI,6EAAC;;AAG3C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,iFAAC;AAC/B,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;;QAE/B,IAAA,CAAA,WAAW,GAAG,CAAC;AAEd,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAA4C,IAAI,gFAAC;AACnE,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,EAAE,kFAAC;;AAExB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAkB,IAAI,kFAAC;AAE3C,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,8EAAC;QACvG,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACtE,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,cAAc,CAAC,SAAS,IAAI,CAAC,qFAAC;AAC/E,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,kBAAkB,IAAI,EAAE,uFAAC;;AAE5E,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAsB,SAAS,4EAAC;QAGrD,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,KAAK,IAAI,CAAC,IAAI,EAAE;IACtC;AAEA,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI;YACF,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;QACxD;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;;AAGA,IAAA,SAAS,CAAC,MAAqB,EAAA;QAC7B,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;IACjG;;AAGA,IAAA,KAAK,CAAC,MAAqB,EAAA;AACzB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAC7D,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW;AAAE,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;;YACjE,IAAI,CAAC,UAAU,EAAE;IACxB;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;;AAExB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;IAEQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;IACzB;AAEA,IAAA,YAAY,CAAC,IAAY,EAAA;AACvB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;IAEA,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,YAAW;YACzB,MAAM,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AACnD,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACnC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,YAAW;YACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC;AACrD,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,iBAAiB,IAAI,CAAC,IAAI,IAAI;AACzE,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,MAAM,IAAI,CAAC,OAAO,EAAE;AACtB,QAAA,CAAC,CAAC;IACJ;;AAGQ,IAAA,MAAM,OAAO,GAAA;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC/B;QACF;AACA,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE;YAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE;YACvD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;AAC3C,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AACtB,YAAA,MAAM,IAAI,CAAC,OAAO,EAAE;YACpB;QACF;AACA,QAAA,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;AACzB,YAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;YAC/D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;AAC9E,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;YAC5B;QACF;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;IAC/B;AAEA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;AAChE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,YAAW;AACzB,YAAA,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;AACxD,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACpC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,IAAY,EAAA;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;AACrH,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,YAAW;AACzB,YAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC;AACvE,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AACpB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,QAAQ,CAAC,qBAAqB,EAAE,MAAM,EAAE;;gBAE1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAClC,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;gBACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC;AACpD,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;gBACtB;YACF;AACA,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,GAAG,gBAAgB,GAAG,aAAa,CAAC;AAC3E,QAAA,CAAC,CAAC;IACJ;IAEA,aAAa,GAAA;AACX,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;AACjE,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,YAAW;AACzB,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AAC9B,QAAA,CAAC,CAAC;IACJ;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;IACjC;AAEQ,IAAA,MAAM,CAAC,MAAqB,EAAA;AAClC,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;IACzB;AAEQ,IAAA,KAAK,CAAC,QAAyB,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,IAAI,QAAQ,CAAC,eAAe;AAAE,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,iBAAiB,GAAG,IAAI;IACjG;AAEQ,IAAA,MAAM,OAAO,GAAA;AACnB,QAAA,IAAI;YACF,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACvC;AAAE,QAAA,MAAM;;QAER;IACF;AAEA;AACkE;IAC1D,MAAM,GAAG,CAAC,EAAuB,EAAA;QACvC,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI;YACF,MAAM,EAAE,EAAE;QACZ;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,SAAS;AAC/C,YAAA,IAAI,IAAI,KAAK,2BAA2B,EAAE;AACxC,gBAAA,IAAI,CAAC,WAAW,GAAG,CAAC;gBACpB,IAAI,CAAC,UAAU,EAAE;YACnB;AACA,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;IACF;+GAjNW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAzB,yBAAyB,EAAA,CAAA,CAAA;;4FAAzB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC;;AAqND;;;AAGG;MAKU,kCAAkC,CAAA;+GAAlC,kCAAkC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlC,kCAAkC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,SAAA,EAFlC,CAAC,yBAAyB,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAE3B,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAJ9C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;oBAClC,SAAS,EAAE,CAAC,yBAAyB,CAAC;AACvC,iBAAA;;;ACnPD,IAAIC,UAAQ,GAAG,CAAC;AAEhB;;;;AAIG;MA2DU,sBAAsB,CAAA;AA1DnC,IAAA,WAAA,GAAA;AA2DqB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,yBAAyB,CAAC;AACzC,QAAA,IAAA,CAAA,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe;AAC1C,QAAA,IAAA,CAAA,OAAO,GAAG,CAAA,kBAAA,EAAqB,EAAEA,UAAQ,EAAE;AAC3C,QAAA,IAAA,CAAA,WAAW,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,OAAO;AACpC,QAAA,IAAA,CAAA,MAAM,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,OAAO;QAE/B,IAAA,CAAA,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxF,IAAA,CAAA,YAAY,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;;AAGtH,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAgB,MAAK;AACxD,YAAA,MAAM,OAAO,GAAkB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;YACpF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE;gBAC1C,IAAI,KAAK,CAAC,CAAC,CAAC;oBAAE;gBACd,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9H;AACA,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,EAAE;gBACxE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAC1F;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,8EAAC;AAEiB,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAqD,MAAK;YAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;YACpC,IAAI,IAAI,KAAK,UAAU;AAAE,gBAAA,OAAO,UAAU;AAC1C,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;AAAE,gBAAA,OAAO,UAAU;YAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC;YAC3E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,eAAe,GAAG,MAAM;AACnF,QAAA,CAAC,2EAAC;AAqBH,IAAA;AAnBW,IAAA,MAAM,CAAC,IAAmB,EAAA;AAClC,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC;IACzC;IAEU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;AAC7B,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE;AAC3B,QAAA,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAClE;IAEU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;AACjC,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO;YAAE;AAC/B,QAAA,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7G;AAEU,IAAA,UAAU,CAAC,IAAY,EAAA;AAC/B,QAAA,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC;IAC7E;+GAjDW,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvDvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EApDS,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,sGAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,EAAA,MAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,KAAA,EAAA,KAAA,EAAA,MAAA,EAAA,aAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAwDtG,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA1DlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,OAAA,EACvB,CAAC,mBAAmB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,CAAC,EAAA,QAAA,EACxG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA;;;AC5DjD,IAAID,UAAQ,GAAG,CAAC;AAEhB;;;;;AAKG;MAQU,mBAAmB,CAAA;AAPhC,IAAA,WAAA,GAAA;AAQqB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,yBAAyB,CAAC;AACzC,QAAA,IAAA,CAAA,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe;QAC1C,IAAA,CAAA,GAAG,GAAG,aAAa;QACnB,IAAA,CAAA,MAAM,GAAG,MAAM;QACf,IAAA,CAAA,KAAK,GAAG,KAAK;AACb,QAAA,IAAA,CAAA,GAAG,GAAG,CAAA,eAAA,EAAkB,EAAEA,UAAQ,EAAE;QAEpC,IAAA,CAAA,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;;AAGvG,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,4EAAC;AAuCrG,IAAA;AArCW,IAAA,KAAK,CAAC,MAAwC,EAAA;AACtD,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,IAAI,MAAM,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,CAAC,CAAC,UAAU;QAC5C,IAAI,OAAO,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,CAAC,CAAC,WAAW;QAC9C,IAAI,KAAK,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,CAAC,CAAC,SAAS;QAC1C,OAAO,MAAM,CAAC,WAAW;IAC3B;AAEU,IAAA,IAAI,CAAC,MAAqB,EAAA;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK;IAC5E;AAEU,IAAA,MAAM,CAAC,MAAqB,EAAA;QACpC,IAAI,CAAC,MAAM,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI,CAAC,CAAC,CAAC,aAAa;AAC/C,QAAA,OAAO,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM;IAC1G;;IAGU,YAAY,GAAA;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AAClC,QAAA,OAAO,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI;IACjE;AAEU,IAAA,SAAS,CAAC,IAAY,EAAA;AAC9B,QAAA,OAAQ,IAAI,CAAC,CAAC,CAAC,MAAiC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;IACjF;AAEU,IAAA,QAAQ,CAAC,MAAqB,EAAA;AACtC,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3C;IAEU,SAAS,GAAA;AACjB,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC1B,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE;AACxB,QAAA,KAAK,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1D;+GAjDW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxBhC,ilOA2IA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxHY,mBAAmB,mlBAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,uSAAE,sBAAsB,EAAA,QAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAK9H,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,WACpB,CAAC,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,sBAAsB,CAAC,EAAA,eAAA,EAGzH,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,ilOAAA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA;;;AEmBjD;;;;;;AAMG;MAEU,qBAAqB,CAAA;AADlC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;QACnC,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE9D,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ;;AAE3B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,CAAC,8EAAC;AA2B7B,IAAA;AAzBC,IAAA,IAAY,OAAO,GAAA;AACjB,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,QAAQ,gBAAgB;IACzC;AAEA,IAAA,IAAY,OAAO,GAAA;AACjB,QAAA,OAAO,IAAI,WAAW,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;IAC1E;IAEA,IAAI,GAAA;QACF,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAe,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7F;IAEA,OAAO,GAAA;QACL,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAkB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,QAAA,CAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7G;IAEA,MAAM,MAAM,CAAC,IAA+D,EAAA;QAC1E,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AACpH,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACjC,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,MAAM,CAAC,EAAU,EAAA;AACf,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAO,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA,CAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/G;+GAjCW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA,CAAA;;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACvClC;;AAEiF;AAC3E,SAAU,cAAc,CAAC,OAAkC,EAAE,KAAa,EAAE,KAAc,EAAE,MAAc,EAAA;IAC9G,MAAM,UAAU,GAAmF,EAAE;AACrG,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,QAAA,MAAM,OAAO,GAA2B,EAAE,aAAa,EAAE,KAAK,EAAE;AAChE,QAAA,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU;AACnF,QAAA,IAAI,MAAM;AAAE,YAAA,OAAO,CAAC,cAAc,CAAC,GAAG,MAAM;QAC5C,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE;IAC5F;AACA,IAAA,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AAChD;AAEA;;;;;;AAMG;MAmEU,gBAAgB,CAAA;AAlE7B,IAAA,WAAA,GAAA;AAmEmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe;AACjC,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS;QAChC,IAAA,CAAA,GAAG,GAAG,aAAa;AACrB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACvC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAClC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAE3C,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS;AAClC,QAAA,IAAA,CAAA,OAAO,GAA8B,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;AAE/G,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;AACpB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;QAC1B,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAsB,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAChF,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAmB,MAAM,6EAAC;AACzC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAiC,EAAE,6EAAC;AACnD,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,EAAE,8EAAC;AACpB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,IAAI,+EAAC;;AAEvB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAA6C,IAAI,6EAAC;AAEjE,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,+EAAC;AACjG,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,+EAAC;AAChD,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC5F,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAA6B,MAAM;YAC5E,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE;YAChD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB,EAAE;AACnD,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACiB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAA6B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,mFAAC;AACrH,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAA6B,MAAM;YAC9E,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC1C,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC1C,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAC5C,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAC3C,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAyEH,IAAA;AAvEW,IAAA,WAAW,CAAC,MAAsB,EAAA;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI;QACzC,OAAO,MAAM,CAAC,WAAW,GAAG,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAClG;IAEU,YAAY,CAAC,IAAY,EAAE,OAAgB,EAAA;QACnD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACrC,QAAA,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEU,IAAA,MAAM,KAAK,GAAA;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI;YACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AAC/C,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;AACrC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACrB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QAC/D;gBAAU;AACR,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B;IACF;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACtB;AAEU,IAAA,MAAM,QAAQ,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1J,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AACxC,gBAAA,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE;AACxB,gBAAA,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AACnE,gBAAA,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACvC,aAAA,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACvE,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE;AAC1D,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACd,gBAAA,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;AACtE,gBAAA,OAAO,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE;qBAC/H,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AACxC,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACjE;gBAAU;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B;IACF;AAEU,IAAA,MAAM,IAAI,GAAA;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM;AACpC,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAI;YACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;QAC1C;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAC1C;IACF;IAEU,IAAI,GAAA;AACZ,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB;+GA5GW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/DjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA5DS,eAAe,yTAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,oJAAE,yBAAyB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAgEhG,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAlE5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EACjB,CAAC,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,aAAa,EAAE,yBAAyB,CAAC,EAAA,QAAA,EAClG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA;;AAiHjD,SAAS,WAAW,CAAC,GAAY,EAAA;AAC/B,IAAA,OAAO,GAAG,YAAY,iBAAiB,IAAK,GAAG,CAAC,KAAK,EAAE,MAA6B,IAAI,EAAE,IAAI,EAAE;AAClG;;AC5MA;;;;;AAKG;MA0BU,qBAAqB,CAAA;AAYhC,IAAA,WAAA,GAAA;AAXiB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACzC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAChC,QAAA,IAAA,CAAA,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe;AAE1C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAiC,EAAE,6EAAC;AACnD,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI,8EAAC;AACtB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AACtB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK,gFAAC;AAC3B,QAAA,IAAA,CAAA,MAAM,GAAG,SAAS,CAAC,eAAe,6EAAC;AAGlD,QAAA,KAAK,IAAI,CAAC,IAAI,EAAE;IAClB;AAEQ,IAAA,MAAM,IAAI,GAAA;AAChB,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAC/C;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;IAEU,MAAM,IAAI,CAAC,KAAa,EAAA;AAChC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE;QAC7B,IAAI,KAAK,KAAK,QAAQ;YAAE;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC;YAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC9C;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;;YAExB,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC5C;gBAAU;AACR,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB;IACF;+GA7CW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAUI,eAAe,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhCzC;;;;;;;;;;;;;;;;;;GAkBT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,mGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAnBS,cAAc,qNAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAuB9B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAzBjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,WACtB,CAAC,cAAc,EAAE,eAAe,CAAC,EAAA,QAAA,EAChC;;;;;;;;;;;;;;;;;;GAkBT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,mGAAA,CAAA,EAAA;kHAYX,eAAe,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACvCrD,IAAIA,UAAQ,GAAG,CAAC;AAEhB;;;;AAIG;MAgEU,6BAA6B,CAAA;AA/D1C,IAAA,WAAA,GAAA;AAgEqB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAC3C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe;AACnC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAChC,QAAA,IAAA,CAAA,OAAO,GAAG,CAAA,iBAAA,EAAoB,EAAEA,UAAQ,EAAE;AAE1C,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MACtC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,gFAAC;AA4BhG,IAAA;AA1BW,IAAA,SAAS,CAAC,IAAY,EAAA;AAC9B,QAAA,OAAQ,IAAI,CAAC,CAAC,CAAC,MAAiC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;IACjF;AAEQ,IAAA,MAAM,CAAC,KAAwB,EAAA;AACrC,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,CAAC,CAAC,eAAe,CAAA,IAAA,EAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;IAC7D;IAEU,MAAM,IAAI,CAAC,KAAwB,EAAA;AAC3C,QAAA,IAAI;AACF,YAAA,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;QACxC;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;QACrC;IACF;AAEU,IAAA,QAAQ,CAAC,KAAwB,EAAA;QACzC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACrG,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,QAAA,CAAC,CAAC,IAAI,GAAG,GAAG;QACZ,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa;QACjC,CAAC,CAAC,KAAK,EAAE;;AAET,QAAA,UAAU,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAClD;+GAnCW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA5D9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAzDS,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,oJAAE,sBAAsB,EAAA,QAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA6DrE,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBA/DzC,SAAS;+BACE,8BAA8B,EAAA,OAAA,EAC/B,CAAC,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,sBAAsB,CAAC,EAAA,QAAA,EACvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA;;;ACrEjD;;;;;AAKG;MAQU,wBAAwB,CAAA;AAsBnC,IAAA,WAAA,GAAA;AArBiB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACzC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe;AACnC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAE3C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI,8EAAC;AACtB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AACtB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAmB,EAAE,+EAAC;AACvC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,EAAE,6EAAC;AACnB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;;AAElB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAgB,IAAI,iFAAC;AACxC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;;QAGpB,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QAC1G,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACzE,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAC1C,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAGjF,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS;AAAE,YAAA,KAAK,IAAI,CAAC,IAAI,EAAE;;AACnC,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;AAEU,IAAA,MAAM,IAAI,GAAA;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI;YACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;YAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;AACjC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;QACxD;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;AAEU,IAAA,GAAG,CAAC,MAAc,EAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;IAC7B;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;IAEU,MAAM,GAAG,CAAC,OAAuB,EAAA;QACzC,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE;AACpC,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpB;QACF;AACA,QAAA,MAAM,IAAI,CAAC,GAAG,CAAC,YAAW;YACxB,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC;AAC5C,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,MAAM,SAAS,GAAA;AACvB,QAAA,MAAM,IAAI,CAAC,GAAG,CAAC,YAAW;YACxB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE;YACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5F,QAAA,CAAC,CAAC;IACJ;IAEQ,MAAM,GAAG,CAAC,EAAuB,EAAA;QACvC,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI;YACF,MAAM,EAAE,EAAE;QACZ;QAAE,OAAO,GAAG,EAAE;YACZ,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,SAAS;YAC/C,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,eAAe,EAAE;AACzD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B;iBAAO;AACL,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC;QACF;gBAAU;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AAAE,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE;IAC1C;AAEU,IAAA,SAAS,CAAC,IAAY,EAAA;AAC9B,QAAA,OAAQ,IAAI,CAAC,CAAC,CAAC,MAAiC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;IACjF;AAEU,IAAA,MAAM,CAAC,OAAuB,EAAA;AACtC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IAC3H;AAEU,IAAA,KAAK,CAAC,OAAuB,EAAA;QACrC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;IACpF;AAEU,IAAA,IAAI,CAAC,OAAuB,EAAA;AACpC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACxH;AAEQ,IAAA,IAAI,CAAC,KAAa,EAAA;AACxB,QAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE;AACjJ,aAAA,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B;+GA3GW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBrC,8tGAoEA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtDY,cAAc,qNAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAK3D,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,OAAA,EACzB,CAAC,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,CAAC,EAAA,eAAA,EAGtD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8tGAAA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA;;;AEFjD,IAAIA,UAAQ,GAAG,CAAC;AAEhB;AAEA;;;;AAIG;MAQU,kBAAkB,CAAA;AA6C7B,IAAA,WAAA,GAAA;AA5CmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;QACvC,IAAA,CAAA,GAAG,GAAG,aAAa;;QAEnB,IAAA,CAAA,OAAO,GAAG,iBAAiB;AAC7B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACvC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAClC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAE3C,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS;AAClC,QAAA,IAAA,CAAA,GAAG,GAAG,CAAA,UAAA,EAAa,EAAEA,UAAQ,EAAE;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI,8EAAC;AACtB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AACtB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAa,EAAE,6EAAC;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;QAEtB,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC3E,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,8EAAC;;AAG/D,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;;AAE1B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,EAAE,iFAAC;AACvB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAiC,EAAE,6EAAC;AACnD,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,EAAE,8EAAC;AACpB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,IAAI,+EAAC;QACvB,IAAA,CAAA,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACrH,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAA6B,MAAM;YAC9E,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACxC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACxC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAC1C,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACzC,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEiB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAoB,MAC5D,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,mFAC3D;;AAGkB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAA4D,IAAI,8EAAC;;AAEjF,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAgB,IAAI,uFAAC;AAkD9C,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gFAAC;QA/CnF,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,KAAK,IAAI,CAAC,IAAI,EAAE;;AAC/B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;QAE5B,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QACjC,MAAM,CAAC,MAAK;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtC,IAAI,OAAO,KAAK,IAAI;gBAAE;YACtB,IAAI,GAAG,OAAO;AACd,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AACpE,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,MAAM,IAAI,GAAA;AAChB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;QACrC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;AAEU,IAAA,MAAM,WAAW,GAAA;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACvD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;AACtC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;;AAEvB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;QACvC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC5D,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B;IACF;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;AAIU,IAAA,MAAM,MAAM,GAAA;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;QAChC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO;YAAE;AACnD,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE;YAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AACvC,gBAAA,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE;gBACxB,IAAI;AACJ,gBAAA,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACvC,aAAA,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;AAC7E,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE;QACnB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D;gBAAU;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B;IACF;AAEU,IAAA,MAAM,WAAW,GAAA;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK;AACnC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAI;YACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACtC;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QACxC;IACF;IAEU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEU,MAAM,MAAM,CAAC,KAAe,EAAA;QACpC,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,KAAK,CAAC,EAAE,EAAE;YACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC;QACF;AACA,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACnC,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9D;IACF;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AAEU,IAAA,UAAU,CAAC,KAAoB,EAAA;AACvC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK;AAClC,QAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE;AAC/I,aAAA,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B;IAEQ,SAAS,CAAC,GAAY,EAAE,QAAgB,EAAA;AAC9C,QAAA,MAAM,MAAM,GAAG,GAAG,YAAY,iBAAiB,GAAI,GAAG,CAAC,KAAK,EAAE,MAA6B,GAAG,SAAS;QACvG,OAAO,MAAM,IAAI,QAAQ;IAC3B;+GA/JW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/B/B,s5KAoGA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1EY,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,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,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,EAAA,MAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,KAAA,EAAA,KAAA,EAAA,MAAA,EAAA,aAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAK7F,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,OAAA,EACnB,CAAC,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,yBAAyB,CAAC,EAAA,eAAA,EAGxF,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,s5KAAA,EAAA,MAAA,EAAA,CAAA,klKAAA,CAAA,EAAA;;;AEHjD;AACA;AACA,MAAM,gBAAgB,GAA+C;AACnE,IAAA,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE;AAC3C,IAAA,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,WAAW,EAAE;AACpD,IAAA,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,cAAc,EAAE;AACrD,IAAA,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE;AAC1C,IAAA,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC3C,IAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;AACrC,IAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;;CAEhC;AAKD;AACA,MAAM,aAAa,GAAuD;IACxE,OAAO,EAAE,uBAAuB,CAAC,OAAO;IACxC,QAAQ,EAAE,uBAAuB,CAAC,cAAc;IAChD,SAAS,EAAE,uBAAuB,CAAC,SAAS;CAC7C;AAED;;;;;;;;;;AAUG;MAcU,sBAAsB,CAAA;AAmEvB,IAAA,YAAY,CAAC,IAAY,EAAA;AACjC,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAuB,CAAC;IAC7C;AAEU,IAAA,SAAS,CAAC,EAAU,EAAA;AAC5B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACrD,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;IAC5C;AAEU,IAAA,UAAU,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAsB,CAAC;IACjD;AAEU,IAAA,OAAO,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAmB,CAAC;IAC/C;AAEU,IAAA,cAAc,CAAC,KAAa,EAAA;AACpC,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAqC,CAAC;IAC7D;AAgBU,IAAA,WAAW,CAAC,KAAa,EAAA;QACjC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C;AAEU,IAAA,SAAS,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAA+B,CAAC;IAC7D;AA6DU,IAAA,YAAY,CAAC,KAAa,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAiC,CAAC;IAClE;AAEU,IAAA,YAAY,CAAC,KAAa,EAAA;QAClC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,KAAK,EAAE,GAAG,IAAI,GAAI,MAAM,CAAC,KAAK,CAAa,CAAC;IACjF;;IAWU,QAAQ,GAAA;AAChB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;IACrB;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;IAC3B;AA6BA,IAAA,WAAA,GAAA;AA9NmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACzC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAC7B,IAAA,CAAA,GAAG,GAAG,aAAa;QACnB,IAAA,CAAA,IAAI,GAAG,mBAAmB;;AAE1B,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,oFAAC;AAEjF,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAC5B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACxC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACzC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC7C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC7C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACtC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACpC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC/C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AACzC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;QACnC,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACpD,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAChC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;QAClE,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;QAEvE,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,QAAQ;;QAE1C,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe;AAE9D;;;;AAIG;QACgB,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,IAAI,SAAS,EAAE;;AAG3D,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAA6B,MAAM;AAC3E,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE;AAC5D,YAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;AAC3D,YAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE;AACpE,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACiB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAA6B,MAAM;YAC7E,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACtD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AAC/C,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAEiB,QAAA,IAAA,CAAA,WAAW,GAA+B,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAChI,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAA6B,MAAM;YAC7E,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAC/C,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACjD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACtD,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEiB,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,gFAAC;AACnD,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,mFAAC;AACvD,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,6EAAC;AAClD,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,mFAAC;AACzD,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,gFAAC;AACnD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ;;;AAyBhC,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAA6B,MAAK;YAC7E,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC;AAC/G,YAAA,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACpG,QAAA,CAAC,sFAAC;AACiB,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,oFAAC;AAEpE,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAA6B,MAAM;YAC5E,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAClD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAClD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAC/C,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAWiB,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACjD,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW;YAC3I,OAAO;gBACL,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,EAAE;AACtF,gBAAA,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS;aAC9B;AACH,QAAA,CAAC,sFAAC;AAEF;AACiG;QACzF,IAAA,CAAA,aAAa,GAAqC,IAAI;AAC3C,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAA4B,MAAM;YAC7E,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,EAAE;AACvG,YAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;AAC7B,iBAAA,kBAAkB;AAClB,iBAAA,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA,EAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAC,EAAE,CAAC,CAAA,CAAA,CAAG,EAAE,CAAC,CAAC,CAAC;AACtF,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGiB,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE;AACjD,YAAA,IAAI;AACF,gBAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;AAClI,sBAAA,CAAA,EAAA,EAAK,QAAQ,CAAC,IAAI,CAAC,GAAG;YAC5B;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,IAAI;YACb;AACF,QAAA,CAAC,sFAAC;AAEiB,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAA6B,MAAM;YAC/E,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YAC7C,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAC9C,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAC/C,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGiB,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAClD,YAAA,IAAI;AACF,gBAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrJ;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,EAAE;YACX;AACF,QAAA,CAAC,uFAAC;;AAGiB,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAA6B,MAAK;AAC9E,YAAA,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACzD,OAAO;gBACL,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;gBAC7C,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;gBAC/B,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;aAChC;AACH,QAAA,CAAC,uFAAC;AACiB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;YAChD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;AACxC,YAAA,OAAO,GAAG,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;AACxC,QAAA,CAAC,qFAAC;;;AAYiB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU;;;AAI/C,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;;;AAe5B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,CAAC,kFAAC;AACrB,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAwC,MAAK;YAC/E,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACtB,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM;gBAC1C,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC;gBACxD,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,MAAM;aAC/C;AACH,QAAA,CAAC,6EAAC;;AAEiB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACvC,YAAA,MAAM,GAAG,GAAG,CAAC,EAAe,EAAE,KAAa,EAAE,QAAgB,EAAE,KAAa,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1I,OAAO;AACL,gBAAA,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACjI,gBAAA,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC5I,gBAAA,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;aAClI;AACH,QAAA,CAAC,mFAAC;;AAGiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAqC,IAAI,iFAAC;AAiF/D,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,kBAAkB,CAAC;;AAExC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO;;AAQ7D;AAC8G;AAC3F,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC,SAAS;;AAgBlF;;AAE0G;AACvF,QAAA,IAAA,CAAA,aAAa,GAAG;YACjC,WAAW,EAAE,IAAI,CAAC,eAAe;AACjC,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;YAC1D,OAAO,EAAE,IAAI,CAAC,eAAe;SACrB;;AAES,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;;AAGtE,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/B,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAChD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACrC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,8BAA8B,CAAC;;AAG3D,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAA6B,MACpE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,kFAAC;AAC/I,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,gFAAC;AACvD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;;AAOvH,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM;YACnD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YACpD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YACpD,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA,IAAA,EAAO,CAAC,CAAC,EAAE,CAAA,CAAE,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;AACpK,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAEiB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YAC1C,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,KAAK,GAAG,MAAM;AAChF,QAAA,CAAC,qFAAC;AAEiB,QAAA,IAAA,CAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,8FAAC;;AAwBjF,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;YAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YAC7C,IAAI,MAAM,KAAK,OAAO;AAAE,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS;YACzD,IAAI,MAAM,KAAK,OAAO;AAAE,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS;AACzD,YAAA,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS;AAAE,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU;AACnF,YAAA,IAAI,CAAC,EAAE;AAAE,gBAAA,OAAO,EAAE;AAClB,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;AACjJ,YAAA,OAAO,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC;AAC7D,QAAA,CAAC,iFAAC;;AAOiB,QAAA,IAAA,CAAA,YAAY,GAAG;aAC/B,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACvE,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;;QA5L3B,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AAAE,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACxD,QAAA,CAAC,CAAC;IACJ;IAEU,aAAa,GAAA;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;;AAGU,IAAA,SAAS,CAAC,IAAiB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;AAC9B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB;QACF;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAC3C,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;QACxI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC;AAEA;;;;;AAKG;IACO,kBAAkB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,aAAa,EAAE;AACvC,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC;YAClC;QACF;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW;AAC/B,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC5B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC9B,QAAA,MAAM,WAAW,GAAG,CAAC,EAAsB,KAAK,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACnH,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;AACzF,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC;AAC9C,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,YAAY;AACpD,QAAA,MAAM,SAAS,GAAG,CAAC,EAAsB,KAAK,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAClH,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;AACxE,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,MAAM,CAAC;AAC9D,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC;IACnD;;IAGA,IAAc,OAAO,GAAA,EAAK,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,IAAc,KAAK,GAAA,EAAK,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;AAGhD,IAAA,IAAc,aAAa,GAAA;AACzB,QAAA,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC;QAC7D,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc;QAC5D,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC;AAC/D,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACjJ,IAAI,OAAO,IAAI,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAChF,OAAO,OAAO,GAAG;AACf,cAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;AACnE,cAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/D;AAEU,IAAA,MAAM,SAAS,GAAA;QACvB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;QAClC,IAAI,CAAC,KAAK,EAAE;YAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE;QAAQ;AACpE,QAAA,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAC/C;;AAOU,IAAA,MAAM,MAAM,GAAA;AACpB,QAAA,IAAI,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;IAC9D;;AAQA,IAAA,IAAc,YAAY,GAAA;QACxB,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACxD,QAAA,MAAM,KAAK,GAAG,OAAO,GAAG,oBAAoB,CAAC,IAAI,OAAO,GAAG,OAAO,CAAC;AACnE,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,EAAE;IAC/C;;AAGA,IAAA,IAAc,YAAY,GAAA;AACxB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;AACpD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK;IACtC;AA4BU,IAAA,OAAO,CAAC,KAAa,EAAA;QAC7B,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD;AAgBU,IAAA,YAAY,CAAC,KAAa,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAiC,CAAC;;QAEhE,IAAI,KAAK,KAAK,MAAM;YAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IACvE;;AAGA,IAAA,IAAc,gBAAgB,GAAA;QAC5B,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;IACpG;;IAGU,MAAM,iBAAiB,CAAC,OAAgB,EAAA;QAChD,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YAC7B;QACF;QACA,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;AAC7C,QAAA,IAAI,CAAC,EAAE;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,yBAAyB,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC;IAC/J;IAcU,OAAO,GAAA;AACf,QAAA,KAAK,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;IACxC;AAOA,IAAA,IAAc,SAAS,GAAA;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS;AACvC,QAAA,OAAO,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE;IACzI;;AAGU,IAAA,MAAM,eAAe,GAAA;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW;AAC7B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO;AAC/B,QAAA,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE;AACxC,YAAA,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE;AAChI,SAAA,CAAC;AACF,QAAA,MAAM,KAAK,GAAG;YACZ,CAAA,EAAG,CAAC,CAAC,WAAW,CAAA,EAAA,EAAK,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,GAAG,CAAA,EAAA,EAAK,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,CAAA,CAAE;YACxE,CAAA,EAAG,CAAC,CAAC,OAAO,CAAA,EAAA,EAAK,IAAI,CAAC,OAAO,IAAI,GAAG,CAAA,CAAE;AACtC,YAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,KAAK,CAAA,EAAA,EAAK,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;AACrD,YAAA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,WAAW,CAAA,EAAA,EAAK,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;AAC/D,YAAA,CAAA,EAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAA,CAAE;AAC7B,YAAA,CAAA,EAAG,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,SAAS,CAAA,CAAE;AACtC,YAAA,CAAA,EAAG,CAAC,CAAC,MAAM,CAAA,EAAA,EAAK,MAAM,CAAC,UAAU,CAAA,CAAA,EAAI,MAAM,CAAC,WAAW,CAAA,EAAA,EAAK,MAAM,CAAC,gBAAgB,CAAA,CAAA,CAAG;AACtF,YAAA,CAAA,EAAG,CAAC,CAAC,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE;YACtB,CAAA,EAAG,CAAC,CAAC,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAA,CAAE;YACxD,CAAA,EAAG,CAAC,CAAC,WAAW,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,GAAG,CAAA,CAAE;YAC9C,CAAA,EAAG,CAAC,CAAC,IAAI,CAAA,EAAA,EAAK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA,CAAE;AACzC,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;AACjB,QAAA,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IAC5D;AAEQ,IAAA,MAAM,IAAI,CAAC,IAAY,EAAE,OAAe,EAAA;AAC9C,QAAA,IAAI;YACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;AACzC,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAC7B;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACzC;IACF;AAEU,IAAA,YAAY,CAAC,IAAa,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;IAClC;+GAtcW,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,gFCzEnC,gpxBA4UA,EAAA,MAAA,EAAA,CAAA,6zDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7QI,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,6DAAE,gBAAgB,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,wBAAwB,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,gEAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3H,mBAAmB,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,6BAA6B,yEAAE,wBAAwB,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kCAAkC,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChH,sBAAsB,+GAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1D,yBAAyB,sJAAE,uBAAuB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,eAAA,EAAA,cAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,wBAAwB,mJAClG,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,2JAAE,kBAAkB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAMvE,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAblC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,OAAA,EACvB;wBACP,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,iBAAiB;AAC3H,wBAAA,mBAAmB,EAAE,6BAA6B,EAAE,wBAAwB,EAAE,kCAAkC;wBAChH,sBAAsB,EAAE,eAAe,EAAE,iBAAiB;AAC1D,wBAAA,yBAAyB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,wBAAwB;AAClG,wBAAA,eAAe,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB;qBACjF,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,gpxBAAA,EAAA,MAAA,EAAA,CAAA,6zDAAA,CAAA,EAAA;;AA2cjD,MAAM,IAAI,GAAG,iEAAiE;AAE9E;AACA,SAAS,QAAQ,CAAC,QAAgB,EAAA;AAChC,IAAA,IAAI;AACF,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE;AACnF,aAAA,aAAa,CAAC,IAAI,IAAI,EAAE;AACxB,aAAA,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,KAAK;QAChD,OAAO,CAAC,IAAI,IAAI,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,KAAK;IACzE;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,KAAK;IACd;AACF;AAEA,SAAS,kBAAkB,CAAC,KAAoB,EAAA;IAC9C,MAAM,OAAO,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpC,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,IAAI;AACzB,IAAA,IAAI;AACF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/G,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B;IACpD;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;IACb;AACF;;AEhhBA;;;;AAIG;MAEU,gBAAgB,CAAA;AAClB,IAAA,YAAY;AACZ,IAAA,MAAM;AACN,IAAA,SAAS;AAKT,IAAA,OAAO;AACP,IAAA,QAAQ;AACR,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,OAAO;;AAEhB,IAAA,OAAO;;AAEE,IAAA,aAAa;AAYb,IAAA,QAAQ;AAmCjB,IAAA,WAAA,GAAA;AA/DS,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,2BAA2B,CAAC;AAClD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;AAC5B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;;AAGlC,QAAA,IAAA,CAAA,kBAAkB,GAAY,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,IAAI,SAAS,EAAE;AAEpG,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAmB,IAAI,+EAAC;AACzC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAW,OAAO,4EAAC;AACjC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,EAAE,+EAAC;AACrB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;;QAEhC,IAAA,CAAA,OAAO,GAAG,CAAC;;AAEF,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,CAAC,oFAAC;AAEzB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AACpC,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AACpC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;QACpC,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC7E,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAC/B,MAAM,IAAI,CAAC,kBAAkB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,oFAClE;AAEQ,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAiC,MAAK;YAChE,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC/B,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB;YAC5C,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAClD,gBAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ;AACpC,gBAAA,IAAI,CAAC,QAAQ;oBAAE;AACf,gBAAA,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,yBAAyB,GAAG,WAAW,EAAE;gBAClG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE;gBAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/B,gBAAA,IAAI,CAAC,MAAM;oBAAE;AACb,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;AACf,oBAAA,GAAG,QAAQ;AACX,oBAAA,EAAE,EAAE,GAAG;AACP,oBAAA,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;AACrC,oBAAA,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM;AACvC,iBAAA,CAAC;YACJ;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,+EAAC;AAEO,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAc,MAAK;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM;AACzC,YAAA,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,CAAS,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC;AACpE,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB;YAC9C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;AACrC,gBAAA,IAAI,IAAI;AAAE,oBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;oBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;YACxC;YACA,OAAO,CAAC,GAAG,OAAO;AACf,iBAAA,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACjG,iBAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;AAC9C,QAAA,CAAC,4EAAC;;;AAKA,QAAA,MAAM,OAAO,GAAI,IAAI,CAAC,MAAqD,CAAC,YAAY;;QAExF,IAAI,UAAU,GAAG,KAAK;QACtB,MAAM,YAAY,GAAG,OAAO,EAAE,SAAS,GAAG,MAAK;AAC7C,YAAA,IAAI,UAAU;gBAAE,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,CAAC,CAAC;QACF,UAAU,GAAG,IAAI;AACjB,QAAA,IAAI,YAAY;AAAE,YAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,YAAY,CAAC,WAAW,EAAE,CAAC;IAClF;IAEA,WAAW,CAAC,QAAmC,EAAE,sBAAsC,EAAA;AACrF,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC/B,KAAK,MAAM,SAAS,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,EAAE;AAC1D,YAAA,IAAI,CAAC,SAAS;gBAAE;YAChB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AAClD,YAAA,IAAI,KAAK;AAAE,gBAAA,OAAO,KAAK;QACzB;AACA,QAAA,OAAO,IAAI;IACb;IAEA,YAAY,CAAC,QAAmC,EAAE,sBAAsC,EAAA;QACtF,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,sBAAsB,CAAC;AAChE,QAAA,IAAI,KAAK;AAAE,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAClC;IAEA,SAAS,GAAA;QACP,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;AAEA,IAAA,IAAI,CAAC,KAAgB,EAAE,IAAA,GAAiB,OAAO,EAAA;AAC7C,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB;IAEA,MAAM,IAAI,CAAC,IAAc,EAAA;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC7B,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,SAAS,GAAG,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,aAAa,GAAG,SAAS;AACnG,QAAA,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,OAAO;AAE7B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AACjD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAEvB,IAAI,IAAI,GAAG,EAAE;QACb,IAAI,MAAM,GAAG,KAAK;AAClB,QAAA,IAAI;YACF,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,GAAG;QAC1C;AAAE,QAAA,MAAM;YACN,MAAM,GAAG,IAAI;QACf;AACA,QAAA,IAAI,MAAM,KAAK,IAAI,CAAC,OAAO;YAAE;AAE7B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC;;IAGA,QAAQ,GAAA;AACN,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB;AAC7C,QAAA,MAAM,KAAK,GAAG,CAAC,IAAW,EAAE,MAAc,KAAI;AAC5C,YAAA,MAAM,IAAI,GAAe,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,IAAI,EAAE,EAAE,MAAM,EAAE;AACzE,YAAA,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,yBAAyB,CAAC,EAAE;gBACpE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC;YAClF;AACA,YAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;AAAE,gBAAA,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC;AAC7D,QAAA,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAAE,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;AACrG,QAAA,OAAO,OAAO;IAChB;+GApJW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACzBlC;;;;;;;;;;;;;;;;;AAiBG;MAoHU,qBAAqB,CAAA;IAoBtB,QAAQ,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC;IACxE;AAIA,IAAA,WAAA,GAAA;AAzBmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO;;AAE/C,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAiB,IAAI,4EAAC;;AAEnC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,KAAK,mFAAC;AAEjB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;AAC5B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;;AAG/B,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,2EAAC;;AAEnD,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,+EAAC;AAClD,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,yBAAyB,IAAI,IAAI,6FAAC;QACrF,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,sBAAsB,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGhG,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,kFAAC;AAMtE,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAS3C,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAoC,MACtE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;aAChB,MAAM,CAAC,CAAC,CAAC,KAAkD,CAAC,CAAC,CAAC,CAAC,kBAAkB;aACjF,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC/E;;AAGkB,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAmB,MACpD,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,4EACzF;QAEkB,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAS,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGjE,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAgB,MAAK;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAChC,YAAA,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,IAAI;AACjE,QAAA,CAAC,2EAAC;;AAGe,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAyB,MAAK;AACnE,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,EAAE,IAAI;AAAE,gBAAA,OAAO,IAAI;YAC5B,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,IAAI;AACb,gBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,aAAa;gBAClC,WAAW,EAAE,IAAI,CAAC,KAAK;gBACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;aAC/C;AACH,QAAA,CAAC,kFAAC;QAEiB,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,iFAAC;QAvCjG,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC;AACrE,QAAA,CAAC,CAAC;IACJ;IAqCU,cAAc,GAAA;AACtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC;IACjD;IAEU,QAAQ,GAAA;AAChB,QAAA,IAAI;AACF,YAAA,KAAK,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;AACzD,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;QACpD;AAAE,QAAA,MAAM;;QAER;IACF;+GAjFW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,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,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/GtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,sjDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAvDS,mBAAmB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,sOAAE,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAiHxE,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAnHjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EACjB,CAAC,mBAAmB,EAAE,aAAa,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,EAAA,eAAA,EACnE,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,sjDAAA,CAAA,EAAA;;;ACvEH;AACA;AACA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB;AAEvD;;;;;;;AAOG;MAyCU,uBAAuB,CAAA;AAelC,IAAA,WAAA,GAAA;AAdmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS;AACjD,QAAA,IAAA,CAAA,GAAG,GAAG,KAAK,CAAC,QAAQ,yEAAU;;AAE9B,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,IAAI,qFAAC;AAEpB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACjD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAC9B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAEnB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI,8EAAC;AACtB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAuB,IAAI,gFAAC;AAC9C,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAiB,IAAI,4EAAC;QAGrD,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,YAAA,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AACxB,QAAA,CAAC,CAAC;;;QAGF,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;gBAAE,IAAI,CAAC,aAAa,EAAE;AACjE,QAAA,CAAC,CAAC;IACJ;;IAGQ,MAAM,OAAO,CAAC,GAAW,EAAA;QAC/B,MAAM,KAAK,GAAG,0BAA0B,CACtC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAC3C,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EACnC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,EACtD,GAAG,CACJ;AACD,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QAErB,MAAM,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;QAClC,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACvB;QACF;QAEA,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;QACtC,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;AAC1B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACvB,IAAI,CAAC,aAAa,EAAE;YACpB;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAExB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,yBAAyB,CAAC;;AAG7G,QAAA,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE;YAAE;AAExB,QAAA,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,aAAa,EAAE;IACtB;;IAGQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAAE;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,KAAK;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB;AAClD,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC7C;+GAzEW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,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,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EApCxB;;;;;;;;;;;;;;;AAeT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,o0BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAjBS,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,oJAAE,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAsC9E,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAxCnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,OAAA,EACnB,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,aAAa,EAAE,qBAAqB,CAAC,EAAA,eAAA,EACzE,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;AAeT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,o0BAAA,CAAA,EAAA;;;ACtCH;;;;;;;;;;;;;AAaG;MAEU,uBAAuB,CAAA;AAKlC,IAAA,WAAA,GAAA;;AAHS,QAAA,IAAA,CAAA,iBAAiB,GAAG,KAAK,CAAC,KAAK,wFAAC;QAChC,IAAA,CAAA,aAAa,GAAG,MAAM,EAAU;QAGvC,MAAM,IAAI,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC,aAAa;AACtE,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAErC,QAAA,MAAM,OAAO,GAAG,CAAC,KAAiB,KAAU;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAAE;YAC/B,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM;gBAAE;YAEtH,MAAM,MAAM,GAAI,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,SAAS,CAAC;YAC/D,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE;YACvC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO;YAE3C,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,QAAA,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAC7C,QAAA,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9E;+GAzBW,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,qBAAA,EAAA,MAAA,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,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAvB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,SAAS;mBAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE;;;ACd9C;;;;;;;;AAQG;AACI,MAAM,4BAA4B,GAAW;AAClD,IAAA,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAC3J,WAAW,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;AACxD,IAAA,eAAe,EAAE,KAAK;;AAGxB,IAAI,QAAqC;AAEzC;AACA,SAAS,QAAQ,GAAA;IACf,IAAI,QAAQ,KAAK,SAAS;AAAE,QAAA,OAAO,QAAQ;IAC3C,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,QAAA,QAAQ,QAAQ,GAAG,IAAI;AAC1D,IAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,WAAW;AAAE,QAAA,QAAQ,QAAQ,GAAG,IAAI;IAChD,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,IAAI,KAAI;AACjD,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG;YAAE;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AACtC,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,IAAI,QAAQ,GAAG,KAAK;AACpB,QAAA,IAAI;YACF,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM;QAClF;AAAE,QAAA,MAAM;YACN,QAAQ,GAAG,KAAK;QAClB;QACA,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACrC,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,qBAAqB,CAAC;QACjD;AACF,IAAA,CAAC,CAAC;AACF,IAAA,QAAQ,QAAQ,GAAG,MAAM;AAC3B;AAEA;AACM,SAAU,yBAAyB,CAAC,IAAY,EAAA;AACpD,IAAA,MAAM,MAAM,GAAG,QAAQ,EAAE;AACzB,IAAA,OAAO,MAAM,GAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAY,GAAG,IAAI;AACxF;;AC1CA;AACA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAErE;;;;AAIG;MAqFU,sBAAsB,CAAA;AApFnC,IAAA,WAAA,GAAA;;AAsFW,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,EAAE,8EAAC;AAEnB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;AAEvB,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAkB,MAAK;AACvD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE;;AAE7B,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI;YACxB,MAAM,KAAK,GAAG,yBAAyB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAW,CAAC;AACvE,YAAA,OAAO,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,KAAK,CAAC;AAC/E,QAAA,CAAC,2EAAC;AACH,IAAA;AATU,IAAA,UAAU;+GAJR,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,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,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/EvB;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,glEAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FA2EU,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBApFlC,SAAS;+BACE,gBAAgB,EAAA,eAAA,EACT,uBAAuB,CAAC,MAAM,iBAEhC,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAC3B;;;;AAIT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,glEAAA,CAAA,EAAA;;;ACVH,IAAI,QAAQ,GAAG,CAAC;AAEhB;AACA,SAAS,IAAI,CAAC,IAAY,EAAA;AACxB,IAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;AACnE;AAEA;;;AAGG;MAkMU,kBAAkB,CAAA;AAjM/B,IAAA,WAAA,GAAA;AAkMqB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC;AAC7B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,QAAA,IAAA,CAAA,OAAO,GAAG,CAAA,iBAAA,EAAoB,EAAE,QAAQ,GAAG;AAE3C,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAA8B,MAAM;AAC3E,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AAC/C,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACxD,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEiB,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAc,MAAK;AACvD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AAChC,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,MAAM;AAC1B,YAAA,OAAO;AACJ,iBAAA,GAAG,CAAC,CAAC,KAAK,MAAM;gBACf,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,gBAAA,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAA,EAAG,KAAK,CAAC,KAAK,CAAA,CAAA,EAAI,KAAK,CAAC,KAAK,CAAA,CAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACjG,aAAA,CAAC;AACD,iBAAA,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD,QAAA,CAAC,+EAAC;AAEiB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA,EAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AASzG,IAAA;AAPW,IAAA,MAAM,CAAC,KAAgB,EAAA;QAC/B,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAC5B;AAEU,IAAA,UAAU,CAAC,IAAY,EAAA;AAC/B,QAAA,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;IACnE;+GA/BW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA7LnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiET,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4vFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAnES,cAAc,sKAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,sJAAE,sBAAsB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA+LnG,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAjM9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,WACb,CAAC,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,sBAAsB,CAAC,EAAA,eAAA,EAC9F,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiET,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,4vFAAA,CAAA,EAAA;;;ACrFH;;;;;;;;;;;;;AAaG;MA0BU,8BAA8B,CAAA;AAzB3C,IAAA,WAAA,GAAA;AA0BqB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO;AACvC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACnC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAEvB,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzF,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;AAC7E,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,uBAAuB;AAChD,SAAA,CAAC;;QAGiB,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,yBAAyB,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAK/G,IAAA;IAHW,WAAW,GAAA;AACnB,QAAA,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IAC3C;+GAfW,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,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EArB/B;;;;;;;;;;;;;;;;;;GAkBT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,kCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EApBS,cAAc,qNAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAuB9B,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAzB1C,SAAS;+BACE,yBAAyB,EAAA,OAAA,EAC1B,CAAC,cAAc,EAAE,eAAe,CAAC,EAAA,eAAA,EACzB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,kCAAA,CAAA,EAAA;;;ACrCH;;;AAGG;MAqBU,yBAAyB,CAAA;AApBtC,IAAA,WAAA,GAAA;AAqBqB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe;AACpC,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MACtC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,gFAAC;AAKhG,IAAA;AAHW,IAAA,YAAY,CAAC,IAAa,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IAC7B;+GATW,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,QAAA,EAAA,EAAA,EAAA,QAAA,EAhB1B;;;;;;;;;;GAUT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAZS,eAAe,yTAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAkB9B,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBApBrC,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,CAAC,eAAe,EAAE,cAAc,CAAC,EAAA,eAAA,EACzB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;AAUT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,yHAAA,CAAA,EAAA;;;ACKH;;;;;;;;;;;;;;;;;;AAkBG;MAoFU,eAAe,CAAA;IAoB1B,WAAA,CACU,MAAc,EACd,KAAmB,EACnB,SAA0B,EAC1B,UAA6B,EAC7B,IAAsB,EAAA;QAJtB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,IAAI,GAAJ,IAAI;;AAvBG,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAC3C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,wBAAwB,CAAC;AAC9C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,oBAAoB,CAAC;;AAEvC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,kBAAkB,CAAC;;AAE1C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACzC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,8BAA8B,CAAC;AAiB1E,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAC/D,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,YAAY,aAAa,CAAC;aAClF,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F;AAEQ,IAAA,mBAAmB,CAAC,GAAW,EAAA;QACrC,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,gBAAgB;IAClD;IAEA,QAAQ,GAAA;;AAEN,QAAA,KAAK,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACjB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;;AAGtB,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AACxB,YAAA,QAAQ,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;YACjD,WAAW,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AACzF,YAAA,gBAAgB,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE;YAC/C,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;YAC9C,YAAY,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AAC3C,SAAA,CAAC;;;;QAKF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC1D,QAAA,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAChD,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACpH;;;;;AAMA,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;;AAE5B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;IAC7B;IAEU,eAAe,CAAC,OAAe,EAAE,IAAY,EAAA;QACrD,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC;IAC/C;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;AAC/B,YAAA,QAAQ,CAAC,eAAe,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,MAAK,EAAkC,CAAC,CAAC;QAChG;aAAO;AACL,YAAA,QAAQ,CAAC,cAAc,IAAI;QAC7B;IACF;+GA/EW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA7DhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yhBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA3DC,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,eAAe,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,QAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,8BAA8B,EAAA,QAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC9B,uBAAuB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,uBAAuB,2HACvB,kBAAkB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,OAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZC,gBAAc,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,qBAAqB,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,kBAAkB,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,0BAA0B,EAAA,QAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1B,4BAA4B,EAAA,QAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,sBAAsB,iEACtB,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAgEhB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAnF3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EACf;wBACP,kBAAkB;wBAClB,kBAAkB;wBAClB,eAAe;wBACf,gBAAgB;wBAChB,8BAA8B;wBAC9B,uBAAuB;wBACvB,uBAAuB;wBACvB,kBAAkB;wBAClB,mBAAmB;wBACnB,YAAY;wBACZA,gBAAc;wBACd,qBAAqB;wBACrB,kBAAkB;wBAClB,0BAA0B;wBAC1B,4BAA4B;wBAC5B,sBAAsB;wBACtB,yBAAyB;qBAC1B,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,yhBAAA,CAAA,EAAA;;;AC9GH;;AAEG;;"}
|