@trismegisto/spine 3.3.1 → 3.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs +2179 -0
  2. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs.map +1 -0
  3. package/fesm2022/{trismegisto-spine-auto-service-home.component-rQ3dIGIE.mjs → trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs} +7 -4
  4. package/fesm2022/trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs.map +1 -0
  5. package/fesm2022/trismegisto-spine-auto-service.mjs +2 -2
  6. package/fesm2022/trismegisto-spine-graphql.mjs +3 -1
  7. package/fesm2022/trismegisto-spine-graphql.mjs.map +1 -1
  8. package/fesm2022/trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs +532 -0
  9. package/fesm2022/trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs.map +1 -0
  10. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs +8429 -0
  11. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs.map +1 -0
  12. package/fesm2022/trismegisto-spine-layout.mjs +1 -7651
  13. package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
  14. package/fesm2022/trismegisto-spine-notification.mjs +1 -1
  15. package/fesm2022/trismegisto-spine-notification.mjs.map +1 -1
  16. package/fesm2022/trismegisto-spine-routing.mjs +16 -3
  17. package/fesm2022/trismegisto-spine-routing.mjs.map +1 -1
  18. package/fesm2022/trismegisto-spine-shell.mjs +4 -2
  19. package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
  20. package/fesm2022/trismegisto-spine.mjs +286 -29
  21. package/fesm2022/trismegisto-spine.mjs.map +1 -1
  22. package/package.json +6 -6
  23. package/types/trismegisto-spine-layout.d.ts +879 -20
  24. package/types/trismegisto-spine-layout.d.ts.map +1 -1
  25. package/types/trismegisto-spine-routing.d.ts.map +1 -1
  26. package/types/trismegisto-spine-shell.d.ts.map +1 -1
  27. package/types/trismegisto-spine.d.ts +130 -12
  28. package/types/trismegisto-spine.d.ts.map +1 -1
  29. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-DIeunpQ9.mjs +0 -2123
  30. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-DIeunpQ9.mjs.map +0 -1
  31. package/fesm2022/trismegisto-spine-auto-service-home.component-rQ3dIGIE.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs","sources":["../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/auto-service-suggestions.service.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-task.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-pickers.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-task-detail.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-task-detail.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-merge.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/auto-service-suggestions.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/auto-service-suggestions.component.html","../../../projects/ui/auto-service/src/pages/auto-service-suggestions-page.component.ts"],"sourcesContent":["import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { urlPath } from '@trismegisto/primitives';\nimport type { SpineSuggestionKind, SpineSuggestionScreen, SpineSuggestionStatus, SpineSuggestionWaiting } from '@trismegisto/spine/layout';\nimport { AUTO_SERVICE_CONFIG } from '../../auto-service.tokens';\nimport {\n AutoServiceSuggestionEvent, AutoServiceTask, TaskCatalogLabel, TaskLabel, TaskMergePreview, TaskPersonOption, TaskPriority,\n TaskRole,\n} from './suggestion-task';\n\nexport type { AutoServiceSuggestionEvent } from './suggestion-task';\n\n/** O quadro: as tarefas, quantos dias a concluída fica nele e a janela do \"vencendo\" (o servidor decide; a tela diz). */\nexport interface AutoServiceSuggestionBoard {\n suggestions: AutoServiceTask[];\n doneDays: number;\n dueSoonDays: number;\n}\n\nexport interface AutoServiceSuggestionArchiveQuery {\n limit: number;\n offset: number;\n search?: string;\n kind?: SpineSuggestionKind | '';\n status?: 'concluida' | 'recusada' | '';\n}\n\n/** O que a equipe edita na tarefa (PATCH): só o que vier. */\nexport interface AutoServiceTaskEdit {\n title?: string;\n kind?: SpineSuggestionKind;\n description_html?: string;\n priority?: TaskPriority;\n start_date?: string | null;\n due_date?: string | null;\n checklist_on_card?: boolean;\n /** Com quem está a vez na conversa (null = em dia). O servidor também muda sozinho a cada comentário. */\n waiting_on?: SpineSuggestionWaiting | null;\n screen?: SpineSuggestionScreen;\n}\n\nexport interface AutoServiceTaskDraft extends AutoServiceTaskEdit {\n title: string;\n status?: SpineSuggestionStatus;\n people?: Array<{ user_id: string; role: TaskRole }>;\n label_ids?: string[];\n}\n\n/** Janelas quando o servidor não diz (as mesmas constantes do argos-admin). */\nexport const AUTO_SERVICE_SUGGESTION_DONE_DAYS = 7;\nexport const AUTO_SERVICE_SUGGESTION_DUE_SOON_DAYS = 1;\n\n/**\n * O quadro de trabalho das sugestões do client — `argos-admin /auto-service/:clientId/suggestions` (atrás do\n * clientAdminGuard, como o resto do auto-serviço). Serviço próprio da tela, para não engordar o `AutoServiceService`.\n * Toda mudança na tarefa responde a tarefa inteira (com o checklist completo); mover responde a tarefa leve.\n */\n@Injectable({ providedIn: 'root' })\nexport class AutoServiceSuggestionsService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n private readonly config = inject(AUTO_SERVICE_CONFIG);\n\n private url(strings: TemplateStringsArray, ...ids: readonly string[]): string {\n return `${this.config.adminApi}/auto-service${urlPath(strings, ...ids)}`;\n }\n\n private get headers(): HttpHeaders {\n return new HttpHeaders({ 'x-access-token': this.auth.getToken() ?? '' });\n }\n\n private read<T>(url: string, params?: HttpParams): Promise<T> {\n return firstValueFrom(this.http.get<T>(url, { headers: this.headers, params }));\n }\n\n /**\n * O quadro (`board=true`): sem arquivadas, recusadas e concluídas fora da janela — o corte é do servidor. A tela\n * filtra o resto sobre a lista inteira: a posição de cada cartão é a da coluna inteira.\n */\n async board(clientId: string): Promise<AutoServiceSuggestionBoard> {\n const res = await this.read<{ suggestions: AutoServiceTask[]; done_days?: number; due_soon_days?: number }>(\n this.url`/${clientId}/suggestions`, new HttpParams().set('board', 'true'));\n return {\n suggestions: res.suggestions ?? [],\n doneDays: res.done_days ?? AUTO_SERVICE_SUGGESTION_DONE_DAYS,\n dueSoonDays: res.due_soon_days ?? AUTO_SERVICE_SUGGESTION_DUE_SOON_DAYS,\n };\n }\n\n /** O arquivo (`archive=true`): arquivadas, recusadas e concluídas antigas, paginado e filtrado no servidor. */\n async archive(clientId: string, q: AutoServiceSuggestionArchiveQuery): Promise<{ suggestions: AutoServiceTask[]; total: number }> {\n let params = new HttpParams().set('archive', 'true').set('limit', q.limit).set('offset', q.offset);\n if (q.search) params = params.set('search', q.search);\n if (q.kind) params = params.set('kind', q.kind);\n if (q.status) params = params.set('status', q.status);\n const res = await this.read<{ suggestions: AutoServiceTask[]; total: number }>(this.url`/${clientId}/suggestions`, params);\n return { suggestions: res.suggestions ?? [], total: res.total ?? 0 };\n }\n\n /** A tarefa inteira (checklist completo, pessoas, rótulos, última atividade). */\n task(clientId: string, id: string): Promise<AutoServiceTask> {\n return this.read<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}`);\n }\n\n /** Pela chave (\"SUG-12\"): o link copiado abre a tarefa. */\n lookup(clientId: string, key: string): Promise<AutoServiceTask> {\n return this.read<AutoServiceTask>(this.url`/${clientId}/suggestions/lookup`, new HttpParams().set('key', key));\n }\n\n create(clientId: string, draft: AutoServiceTaskDraft): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions`, draft, { headers: this.headers }));\n }\n\n update(clientId: string, id: string, edit: AutoServiceTaskEdit): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.patch<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}`, edit, { headers: this.headers }));\n }\n\n /**\n * Arrastar ou mudar pelo detalhe: status (coluna) e/ou posição (índice na coluna de destino, contando a coluna\n * inteira); `comment` vai junto com a mudança de status (`internal` = só a equipe vê).\n */\n move(clientId: string, id: string, change: { status?: SpineSuggestionStatus; position?: number; comment?: string; internal?: boolean }): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.patch<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}`, change, { headers: this.headers }));\n }\n\n remove(clientId: string, id: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(this.url`/${clientId}/suggestions/${id}`, { headers: this.headers }));\n }\n\n setArchived(clientId: string, id: string, archived: boolean): Promise<AutoServiceTask> {\n const url = archived ? this.url`/${clientId}/suggestions/${id}/archive` : this.url`/${clientId}/suggestions/${id}/restore`;\n return firstValueFrom(this.http.post<AutoServiceTask>(url, {}, { headers: this.headers }));\n }\n\n /** Prévia do agrupamento em `into`: quantos relatores e apoios passariam (nada é gravado). */\n mergePreview(clientId: string, id: string, into: string): Promise<TaskMergePreview> {\n return this.read<TaskMergePreview>(this.url`/${clientId}/suggestions/${id}/merge`, new HttpParams().set('into', into));\n }\n\n /** Agrupa esta em `into`: responde o destino inteiro (com os relatores e as agrupadas). */\n merge(clientId: string, id: string, into: string): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/merge`, { into }, { headers: this.headers }));\n }\n\n /** Desagrupa esta (a origem): ela volta ao quadro; responde ela inteira. */\n unmerge(clientId: string, id: string): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/unmerge`, {}, { headers: this.headers }));\n }\n\n /** Comentários ou atividades, do mais novo, paginado. */\n events(clientId: string, id: string, q: { type: 'comments' | 'activity'; limit: number; offset: number }): Promise<{ events: AutoServiceSuggestionEvent[]; total: number }> {\n const params = new HttpParams().set('type', q.type).set('limit', q.limit).set('offset', q.offset);\n return this.read(this.url`/${clientId}/suggestions/${id}/events`, params);\n }\n\n comment(clientId: string, id: string, comment: string, internal = false): Promise<AutoServiceSuggestionEvent> {\n return firstValueFrom(this.http.post<AutoServiceSuggestionEvent>(this.url`/${clientId}/suggestions/${id}/comments`, { comment, internal }, { headers: this.headers }));\n }\n\n /** Marca a conversa como lida por quem consulta (zera o `unread` da tarefa). */\n markRead(clientId: string, id: string): Promise<void> {\n return firstValueFrom(this.http.post<void>(this.url`/${clientId}/suggestions/${id}/read`, {}, { headers: this.headers }));\n }\n\n /** Responsável/envolvido: `userId` ou \"me\" (atribuir a mim). */\n addPerson(clientId: string, id: string, userId: string, role: TaskRole): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/people`, { user_id: userId, role }, { headers: this.headers }));\n }\n\n removePerson(clientId: string, id: string, userId: string, role: TaskRole): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.delete<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/people/${userId}`, {\n headers: this.headers, params: new HttpParams().set('role', role),\n }));\n }\n\n addChecklistItem(clientId: string, id: string, text: string): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/checklist`, { text }, { headers: this.headers }));\n }\n\n updateChecklistItem(clientId: string, id: string, itemId: string, change: { text?: string; done?: boolean; position?: number }): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.patch<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/checklist/${itemId}`, change, { headers: this.headers }));\n }\n\n removeChecklistItem(clientId: string, id: string, itemId: string): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.delete<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/checklist/${itemId}`, { headers: this.headers }));\n }\n\n // --- rótulos ---\n\n async labels(clientId: string): Promise<TaskCatalogLabel[]> {\n const res = await this.read<{ labels: TaskCatalogLabel[] }>(this.url`/${clientId}/suggestions/labels`);\n return res.labels ?? [];\n }\n\n createLabel(clientId: string, name: string, color: string): Promise<TaskLabel> {\n return firstValueFrom(this.http.post<TaskLabel>(this.url`/${clientId}/suggestions/labels`, { name, color }, { headers: this.headers }));\n }\n\n setLabel(clientId: string, id: string, labelId: string, linked: boolean): Promise<AutoServiceTask> {\n const url = this.url`/${clientId}/suggestions/${id}/labels/${labelId}`;\n return firstValueFrom(linked\n ? this.http.put<AutoServiceTask>(url, {}, { headers: this.headers })\n : this.http.delete<AutoServiceTask>(url, { headers: this.headers }));\n }\n\n // --- pessoas do realm do app (a mesma busca da aba Grupos, com a foto) ---\n\n async searchPeople(clientId: string, search: string): Promise<TaskPersonOption[]> {\n let params = new HttpParams().set('limit', 10);\n if (search.trim()) params = params.set('search', search.trim());\n const res = await this.read<{ users: TaskPersonOption[] }>(this.url`/${clientId}/users`, params);\n return res.users ?? [];\n }\n}\n","import type { SpineSuggestion, SpineSuggestionPerson, SpineSuggestionStatus } from '@trismegisto/spine/layout';\n\n// O que a equipe vê de uma sugestão no quadro de trabalho (auto-serviço): a sugestão de quem pediu mais o que é da\n// tarefa -- chave, prioridade, datas, capa, descrição rica, pessoas, rótulos e checklist. Constantes e contas puras\n// (prazo, capa) ficam aqui, fora dos componentes, para o cartão, o detalhe e os testes usarem as mesmas.\n\nexport const TASK_PRIORITIES = ['urgente', 'alta', 'media', 'baixa'] as const;\nexport type TaskPriority = (typeof TASK_PRIORITIES)[number];\n\n/** Ícone e intenção de cada prioridade (o texto vem do catálogo; a cor nunca é a única pista). */\nexport const TASK_PRIORITY_ICONS: Record<TaskPriority, string> = {\n urgente: 'exclamation-triangle', alta: 'arrow-up', media: 'minus', baixa: 'arrow-bottom',\n};\n\n/** Cores de rótulo: tokens da paleta categórica do tema (o servidor só aceita estes). */\nexport const TASK_LABEL_COLORS = ['cat-1', 'cat-2', 'cat-3', 'cat-4', 'cat-5', 'cat-6', 'cat-7', 'cat-8'] as const;\n\nexport type TaskRole = 'responsavel' | 'envolvido';\n\nexport interface TaskLabel { id: string; name: string; color: string }\nexport interface TaskCatalogLabel extends TaskLabel { uses: number }\nexport interface TaskChecklistItem { id: string; text: string; done: boolean; position: number; done_by: string | null; done_at: string | null }\n\n/** Uma sugestão citada por outra (o destino de uma agrupada, as agrupadas de um destino). */\nexport interface TaskRef { id: string; key: string; title: string }\n/** Quem pediu: o autor (`role: author`) ou um relator que veio de uma agrupada (`from_suggestion_id`). */\nexport interface TaskReporter extends SpineSuggestionPerson { role: 'author' | 'reporter'; from_suggestion_id: string | null }\n/** Uma agrupada no detalhe do destino. */\nexport interface TaskMergedOrigin extends TaskRef { status: SpineSuggestionStatus; author: SpineSuggestionPerson | null }\n\nexport interface AutoServiceTask extends SpineSuggestion {\n key: string;\n key_number: number;\n description_html: string;\n priority: TaskPriority;\n start_date: string | null;\n due_date: string | null;\n checklist_on_card: boolean;\n origin: 'usuario' | 'equipe';\n archived_at: string | null;\n assignees: SpineSuggestionPerson[];\n watchers: SpineSuggestionPerson[];\n labels: TaskLabel[];\n checklist: { total: number; done: number; items: TaskChecklistItem[] | null };\n last_activity: { at: string; actor: SpineSuggestionPerson | null } | null;\n /** Agrupada em outra: o destino (sai do quadro e fica no arquivo). */\n merged_into?: TaskRef | null;\n /** Quantas foram agrupadas nesta. */\n merged_count?: number;\n /** Relatores além do autor (vindos das agrupadas). */\n reporters_count?: number;\n /** Só no detalhe: o autor e os relatores extras, com foto. */\n reporters?: TaskReporter[];\n /** Só no detalhe: as agrupadas nesta. */\n merged?: TaskMergedOrigin[];\n /** Os grupos de quem pediu (o escopo de quem vê a sugestão); vazio = criada pela equipe. */\n groups?: Array<{ id: string; name: string }>;\n /** Mensagens de quem pede que quem consulta ainda não leu. */\n unread?: number;\n}\n\n/** O que um agrupamento passaria para o destino (a prévia do servidor). */\nexport interface TaskMergePreview { reporters: number; votes: number; target: TaskRef }\n\n/** Um passo do histórico: status, comentário (interno = só a equipe) ou mudança de um campo (field + antes/depois). */\nexport interface AutoServiceSuggestionEvent {\n id: string;\n kind: 'status' | 'comment' | 'change';\n from_status: SpineSuggestionStatus | 'nova' | null;\n to_status: SpineSuggestionStatus | 'nova' | null;\n comment: string | null;\n internal?: boolean;\n /** Escrito por quem pediu (ou um envolvido) pela página de quem pede. */\n from_requester?: boolean;\n field?: string | null;\n from_value?: string | null;\n to_value?: string | null;\n created_at: string;\n actor: SpineSuggestionPerson | null;\n}\n\n/** Pessoa da busca do auto-serviço (`GET /auto-service/:clientId/users`), com a foto. */\nexport interface TaskPersonOption { id: string; username: string | null; name: string | null; email?: string | null; picture: string | null }\n\n/** Situação do prazo: vencida (antes de hoje, aberta), hoje, amanhã, futura, ou sem prazo / encerrada. */\nexport type DueState = 'overdue' | 'today' | 'tomorrow' | 'later' | null;\n\n/** Hoje como AAAA-MM-DD no fuso dado (o do perfil da pessoa). */\nexport function todayIso(timeZone?: string, now = new Date()): string {\n try {\n return new Intl.DateTimeFormat('en-CA', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit' }).format(now);\n } catch {\n return now.toISOString().slice(0, 10);\n }\n}\n\n/** AAAA-MM-DD mais `days` dias (negativo volta). */\nexport function addDays(iso: string, days: number): string {\n const d = new Date(`${iso}T00:00:00Z`);\n d.setUTCDate(d.getUTCDate() + days);\n return d.toISOString().slice(0, 10);\n}\n\n/** O prazo da tarefa contra hoje. Concluída/recusada não vence. */\nexport function dueState(task: Pick<AutoServiceTask, 'due_date' | 'status'>, today: string): DueState {\n if (!task.due_date || task.status === 'concluida' || task.status === 'recusada') return null;\n if (task.due_date < today) return 'overdue';\n if (task.due_date === today) return 'today';\n if (task.due_date === addDays(today, 1)) return 'tomorrow';\n return 'later';\n}\n\n/** Dias inteiros entre duas datas AAAA-MM-DD (`to` - `from`). */\nexport function daysBetween(from: string, to: string): number {\n return Math.round((Date.parse(`${to}T00:00:00Z`) - Date.parse(`${from}T00:00:00Z`)) / 86_400_000);\n}\n\n/** Duração em dias, horas e minutos inteiros (o \"4h 12min\" do quadro). Negativa vira zero. */\nexport function splitDuration(ms: number): { d: number; h: number; m: number } {\n const minutes = Math.max(0, Math.floor(ms / 60_000));\n return { d: Math.floor(minutes / 1440), h: Math.floor((minutes % 1440) / 60), m: minutes % 60 };\n}\n\n/** Responsável por mim? (o `sub` da sessão) */\nexport const assignedTo = (task: AutoServiceTask, userId: string) => !!userId && task.assignees.some((p) => p.user_id === userId);\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { AccountAvatarComponent, ButtonComponent, CheckboxComponent, IconComponent, SearchFieldComponent } from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AutoServiceSuggestionsService } from './auto-service-suggestions.service';\nimport { TASK_LABEL_COLORS, TaskCatalogLabel, TaskPersonOption } from './suggestion-task';\n\n// Os pequenos seletores do quadro de sugestões, para ir dentro de um `hm-popover` (o cartão e o detalhe da tarefa):\n// pessoas do realm do app (com foto) e rótulos do catálogo do app.\n\n/**\n * Pessoa do realm do app: busca (a mesma do auto-serviço, com a foto), as já escolhidas de fora. Lê na abertura (as\n * primeiras) e a cada termo, com espera.\n */\n@Component({\n selector: 'spine-suggestion-people-picker',\n imports: [AccountAvatarComponent, SearchFieldComponent],\n template: `\n <div class=\"as-picker\">\n <hm-search-field [label]=\"text.peopleSearch\" labelHidden [placeholder]=\"text.peopleSearch\" [landmark]=\"false\"\n [debounce]=\"250\" [loading]=\"loading()\" (search)=\"load($event)\" />\n <ul class=\"as-picker__list\" [attr.aria-busy]=\"loading() ? 'true' : null\">\n @for (p of options(); track p.id) {\n <li>\n <button type=\"button\" class=\"as-picker__person\" (click)=\"picked.emit(p)\">\n <hm-account-avatar size=\"small\" [name]=\"nameOf(p)\" [imageUrl]=\"p.picture\" />\n <span class=\"as-picker__person-text\">\n <span class=\"as-picker__person-name\">{{ nameOf(p) }}</span>\n @if (p.username && p.name) { <span class=\"as-picker__muted\">{{ p.username }}</span> }\n </span>\n </button>\n </li>\n } @empty {\n @if (!loading()) { <li class=\"as-picker__muted\">{{ text.peopleEmpty }}</li> }\n }\n </ul>\n </div>\n `,\n styleUrl: './suggestion-pickers.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SuggestionPeoplePickerComponent {\n protected readonly text = inject(SPINE_MESSAGES).suggestions;\n private readonly service = inject(AutoServiceSuggestionsService);\n readonly clientId = input.required<string>();\n /** Quem já está no papel (não aparece de novo). */\n readonly exclude = input<readonly string[]>([]);\n readonly picked = output<TaskPersonOption>();\n\n private readonly found = signal<TaskPersonOption[]>([]);\n protected readonly loading = signal(false);\n protected readonly options = computed(() => this.found().filter((p) => !this.exclude().includes(p.id)));\n private seq = 0;\n\n constructor() {\n effect(() => {\n this.clientId();\n untracked(() => void this.load(''));\n });\n }\n\n protected async load(term: string): Promise<void> {\n const mine = ++this.seq;\n this.loading.set(true);\n try {\n const list = await this.service.searchPeople(this.clientId(), term);\n if (mine === this.seq) this.found.set(list);\n } catch {\n if (mine === this.seq) this.found.set([]);\n } finally {\n if (mine === this.seq) this.loading.set(false);\n }\n }\n\n protected nameOf(p: TaskPersonOption): string {\n return p.name || p.username || p.email || '';\n }\n}\n\n/**\n * Rótulos do catálogo do app: marcar/desmarcar (caixa por rótulo, o ponto na cor dele) e, quando o termo digitado não\n * existe, \"Criar o rótulo\" com a cor escolhida.\n */\n@Component({\n selector: 'spine-suggestion-label-picker',\n imports: [ButtonComponent, CheckboxComponent, SearchFieldComponent],\n template: `\n <div class=\"as-picker\">\n <hm-search-field [label]=\"text.labelFilter\" labelHidden [placeholder]=\"text.labelFilter\" [landmark]=\"false\"\n [value]=\"term()\" (valueChange)=\"term.set($event)\" />\n <ul class=\"as-picker__list\">\n @for (l of shown(); track l.id) {\n <li class=\"as-picker__label-row\">\n <span class=\"as-picker__dot\" [class]=\"'as-tok--' + l.color\" aria-hidden=\"true\"></span>\n <hm-checkbox [label]=\"l.name\" [checked]=\"selected().includes(l.id)\" (checkedChange)=\"toggled.emit({ label: l, linked: $event })\" />\n </li>\n } @empty {\n @if (!creatable()) { <li class=\"as-picker__muted\">{{ text.noLabels }}</li> }\n }\n </ul>\n @if (creatable()) {\n <span class=\"as-picker__heading\">{{ text.labelColor }}</span>\n <div class=\"as-picker__swatches\">\n @for (c of colors; track c; let i = $index) {\n <button type=\"button\" class=\"as-picker__swatch as-picker__swatch--small\" [class]=\"'as-tok--' + c\"\n [attr.aria-label]=\"colorName(i)\" [attr.aria-pressed]=\"color() === c\" (click)=\"color.set(c)\"></button>\n }\n </div>\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"plus\" (clicked)=\"create()\">{{ createText() }}</hm-button>\n }\n </div>\n `,\n styleUrl: './suggestion-pickers.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SuggestionLabelPickerComponent {\n protected readonly text = inject(SPINE_MESSAGES).suggestions;\n readonly labels = input<readonly TaskCatalogLabel[]>([]);\n readonly selected = input<readonly string[]>([]);\n readonly toggled = output<{ label: TaskCatalogLabel; linked: boolean }>();\n readonly created = output<{ name: string; color: string }>();\n\n protected readonly colors = TASK_LABEL_COLORS;\n protected readonly term = signal('');\n protected readonly color = signal<string>('cat-1');\n protected readonly shown = computed(() => {\n const t = this.term().trim().toLocaleLowerCase();\n return this.labels().filter((l) => !t || l.name.toLocaleLowerCase().includes(t));\n });\n /** Termo que ainda não é rótulo: dá para criar. */\n protected readonly creatable = computed(() => {\n const t = this.term().trim().toLocaleLowerCase();\n return !!t && t.length <= 40 && !this.labels().some((l) => l.name.toLocaleLowerCase() === t);\n });\n protected readonly createText = computed(() => formatMessage(this.text.createLabel, { name: this.term().trim() }));\n\n protected colorName(i: number): string {\n return formatMessage(this.text.labelColorName, { n: i + 1 });\n }\n\n protected create(): void {\n const name = this.term().trim();\n if (!name) return;\n this.created.emit({ name, color: this.color() });\n this.term.set('');\n }\n}\n","import { Location } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n AccountAvatarComponent, AlertComponent, ButtonComponent, CheckboxComponent, DatePickerComponent, HermesDialogService,\n HermesToastService, IconButtonComponent, IconComponent, InputComponent, ModalComponent, PopoverComponent,\n PopoverTriggerDirective, RichTextComponent, SelectComponent, SwitchComponent, TabComponent, TabsComponent, TagComponent,\n TextareaComponent,\n} from '@trismegisto/angular';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES, SpinePreferencesService, SpineUserStorage } from '@trismegisto/spine';\nimport {\n SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_KINDS, SPINE_SUGGESTION_LIMITS, SPINE_SUGGESTION_STATUS_COLORS,\n SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_WAITING, SPINE_SUGGESTION_WAITING_COLORS, SpineSuggestionKind,\n SpineChatMessage, SpineSuggestionChatComponent, SpineSuggestionPerson, SpineSuggestionStatus, SpineSuggestionWaiting,\n SpineTagRowComponent, SpineTagRowItem,\n} from '@trismegisto/spine/layout';\nimport { AutoServiceSuggestionsService } from './auto-service-suggestions.service';\nimport {\n SuggestionLabelPickerComponent, SuggestionPeoplePickerComponent,\n} from './suggestion-pickers.component';\nimport {\n AutoServiceSuggestionEvent, AutoServiceTask, DueState, TASK_PRIORITIES, TASK_PRIORITY_ICONS, TaskCatalogLabel,\n TaskChecklistItem, TaskMergedOrigin, TaskPersonOption, TaskPriority, TaskReporter, TaskRole, dueState, todayIso,\n} from './suggestion-task';\n\nconst EVENTS_PAGE = 20;\n\n/** Copia para a área de transferência; false se o navegador recusar. */\nexport async function copyText(value: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * A tarefa aberta (modal grande, duas colunas, como os quadros de tarefas conhecidos), montada pelo quadro.\n *\n * - **Esquerda**: título editável no lugar (Enter salva, Esc desiste), descrição em `hm-rich-text` (ler; \"Editar\"\n * abre o editor e \"Salvar\" grava o HTML, que o servidor saneia), checklist (marcar, renomear, subir/descer, remover,\n * \"Mostrar no cartão\") e as abas Comentários e Atividades (do mais novo, \"Carregar mais\"). Comentário é texto simples\n * e pode ser interno (só a equipe vê; quem pediu não lê em \"Minhas sugestões\").\n * - **Direita**: status, tipo, responsáveis (\"Atribuir a mim\") e envolvidos (busca de pessoas do realm, com foto),\n * relator, prioridade, início e conclusão, rótulos (catálogo do app; cria na hora), capa, tela de origem (\"Abrir a\n * tela\" quando o app administrado é o desta sessão), apoios, criada/atualizada e \"Última alteração há X por Fulano\";\n * a chave com copiar; arquivar/restaurar e excluir (com confirmação).\n * - **Agrupar**: \"Relatores\" (o autor e quem veio das agrupadas, com foto) no lugar do relator; \"Agrupadas aqui\" (chave,\n * título e autor de cada origem, com link e \"Desagrupar\"); \"Agrupar em…\" pede o seletor ao quadro (`mergeRequested`).\n * Na agrupada, o aviso \"Agrupada em SUG-12\" no topo, com \"Abrir SUG-12\" (`openTask`) e \"Desagrupar\" (`unmerged`).\n * - **Nova tarefa** (`task` nulo, `draft`): título, tipo, coluna, prioridade, datas, descrição, rótulos e \"Atribuir a\n * mim\"; criar troca para a tarefa completa.\n *\n * Toda mudança vai direto ao servidor, que devolve a tarefa inteira: ela vira a nova verdade aqui (`taskChange`) e no\n * quadro (`changed`).\n */\n@Component({\n selector: 'spine-suggestion-task-detail',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, CheckboxComponent, DatePickerComponent, IconButtonComponent,\n IconComponent, InputComponent, ModalComponent, PopoverComponent, PopoverTriggerDirective, RichTextComponent,\n SelectComponent, SuggestionLabelPickerComponent, SuggestionPeoplePickerComponent,\n SpineSuggestionChatComponent, SpineTagRowComponent, SwitchComponent, TabComponent, TabsComponent, TagComponent, TextareaComponent,\n ],\n templateUrl: './suggestion-task-detail.component.html',\n styleUrl: './suggestion-task-detail.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SuggestionTaskDetailComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.suggestions;\n private readonly service = inject(AutoServiceSuggestionsService);\n private readonly toast = inject(HermesToastService);\n private readonly dialogs = inject(HermesDialogService);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly userStorage = inject(SpineUserStorage, { optional: true });\n private readonly router = inject(Router, { optional: true });\n private readonly location = inject(Location, { optional: true });\n\n readonly clientId = input.required<string>();\n /** A tarefa aberta (leve, do quadro: a completa chega do servidor). null + `draft` = nova tarefa. */\n readonly task = input<AutoServiceTask | null>(null);\n readonly draft = input(false);\n /** Coluna da nova tarefa. */\n readonly draftStatus = input<SpineSuggestionStatus>('em_analise');\n readonly labels = input<readonly TaskCatalogLabel[]>([]);\n /** A tela da sugestão abre daqui (o app administrado é o desta sessão). */\n readonly canOpenScreen = input(false);\n\n /** A tarefa mudou (o servidor devolveu a nova versão). */\n readonly changed = output<AutoServiceTask>();\n readonly created = output<AutoServiceTask>();\n readonly removed = output<AutoServiceTask>();\n readonly closed = output<void>();\n /** Um rótulo novo entrou no catálogo. */\n readonly labelCreated = output<TaskCatalogLabel>();\n /** \"Agrupar em…\": o quadro fecha este modal e abre o seletor. */\n readonly mergeRequested = output<AutoServiceTask>();\n /** Abrir outra tarefa pelo id (o destino de uma agrupada, uma das agrupadas). */\n readonly openTask = output<string>();\n /** Desagrupou (daqui): o quadro relê, a origem volta para ele. */\n readonly unmerged = output<void>();\n\n protected readonly statuses = SPINE_SUGGESTION_STATUSES;\n protected readonly statusColors = SPINE_SUGGESTION_STATUS_COLORS;\n protected readonly waitingValues = SPINE_SUGGESTION_WAITING;\n protected readonly waitingColors = SPINE_SUGGESTION_WAITING_COLORS;\n protected readonly kinds = SPINE_SUGGESTION_KINDS;\n protected readonly kindColors = SPINE_SUGGESTION_KIND_COLORS;\n protected readonly priorities = TASK_PRIORITIES;\n protected readonly priorityIcons = TASK_PRIORITY_ICONS;\n protected readonly limits = SPINE_SUGGESTION_LIMITS;\n protected readonly today = todayIso(this.preferences.effectiveTimeZone());\n\n protected readonly current = signal<AutoServiceTask | null>(null);\n protected readonly loadError = signal('');\n protected readonly busy = signal(false);\n protected readonly open = computed(() => !!this.current() || this.draft());\n protected readonly heading = computed(() => {\n const t = this.current();\n return t ? `${t.key} · ${t.title}` : this.text.newTaskHeading;\n });\n\n // título e descrição\n protected readonly editingTitle = signal(false);\n protected readonly titleDraft = signal('');\n protected readonly editingDescription = signal(false);\n protected readonly descriptionDraft = signal('');\n\n // checklist\n protected readonly newItem = signal('');\n protected readonly renaming = signal<string | null>(null);\n protected readonly renameDraft = signal('');\n\n // comentários e atividades\n /** Resumo (descrição e checklist), Comentários (a conversa com quem pediu) e Histórico (tudo o que mudou). */\n protected readonly tab = signal<'summary' | 'comments' | 'activity'>('summary');\n protected readonly comments = signal<AutoServiceSuggestionEvent[]>([]);\n protected readonly commentsTotal = signal(0);\n protected readonly activity = signal<AutoServiceSuggestionEvent[]>([]);\n protected readonly activityTotal = signal(0);\n protected readonly eventsLoading = signal(false);\n private readonly chat = viewChild(SpineSuggestionChatComponent);\n /**\n * A aba Comentários como chat (do mais antigo ao mais novo; a lista vem do mais novo). À direita, o que a pessoa\n * escreveu como equipe; o que ela escreveu como quem pede (pela página) fica à esquerda, como os outros.\n */\n protected readonly chatItems = computed<SpineChatMessage[]>(() => [...this.comments()].reverse().map((e) => ({\n id: e.id, text: e.comment ?? '', created_at: e.created_at, author: e.actor, from_requester: !!e.from_requester,\n internal: !!e.internal, status: e.kind === 'status' && e.to_status !== 'nova' ? e.to_status : null,\n })));\n /** As abas de eventos já lidas desta tarefa (vazia também conta: trocar de aba não relê). */\n private readonly loadedTabs = new Set<'comments' | 'activity'>();\n protected readonly comment = signal('');\n protected readonly commentInternal = signal(false);\n protected readonly commentError = signal('');\n protected readonly commenting = signal(false);\n\n // nova tarefa\n protected readonly draftTitle = signal('');\n protected readonly draftTitleError = signal('');\n protected readonly draftKind = signal<string>('melhoria');\n protected readonly draftColumn = signal<string>('em_analise');\n protected readonly draftPriority = signal<string>('media');\n protected readonly draftStart = signal<string | null>(null);\n protected readonly draftDue = signal<string | null>(null);\n protected readonly draftDescription = signal('');\n protected readonly draftLabels = signal<string[]>([]);\n protected readonly draftAssignMe = signal(true);\n\n protected readonly selectedLabels = computed(() => this.current()?.labels.map((l) => l.id) ?? this.draftLabels());\n protected readonly assigneeIds = computed(() => this.current()?.assignees.map((p) => p.user_id) ?? []);\n protected readonly watcherIds = computed(() => this.current()?.watchers.map((p) => p.user_id) ?? []);\n protected readonly checklistItems = computed(() => [...(this.current()?.checklist.items ?? [])].sort((a, b) => a.position - b.position));\n protected readonly dueSituation = computed<DueState>(() => {\n const t = this.current();\n return t ? dueState(t, this.today) : null;\n });\n protected readonly isMine = computed(() => {\n const me = this.me();\n return !!me && this.assigneeIds().includes(me);\n });\n\n constructor() {\n effect(() => {\n const task = this.task();\n const draft = this.draft();\n untracked(() => {\n this.reset();\n if (task) void this.load(task);\n else if (draft) this.startDraft();\n });\n });\n }\n\n protected me(): string {\n return this.userStorage?.userId() ?? '';\n }\n\n private reset(): void {\n this.current.set(null);\n this.loadError.set('');\n this.editingTitle.set(false);\n this.editingDescription.set(false);\n this.renaming.set(null);\n this.newItem.set('');\n this.comments.set([]);\n this.activity.set([]);\n this.commentsTotal.set(0);\n this.activityTotal.set(0);\n this.comment.set('');\n this.commentInternal.set(false);\n this.commentError.set('');\n this.tab.set('summary');\n this.loadedTabs.clear();\n }\n\n private startDraft(): void {\n this.draftTitle.set('');\n this.draftTitleError.set('');\n this.draftKind.set('melhoria');\n this.draftColumn.set(this.draftStatus());\n this.draftPriority.set('media');\n this.draftStart.set(null);\n this.draftDue.set(null);\n this.draftDescription.set('');\n this.draftLabels.set([]);\n this.draftAssignMe.set(true);\n }\n\n private async load(light: AutoServiceTask): Promise<void> {\n this.current.set(light);\n try {\n const full = await this.service.task(this.clientId(), light.id);\n if (this.task()?.id !== light.id) return;\n this.current.set({ ...full, author: full.author ?? light.author });\n void this.loadEvents('comments', true);\n if (full.unread || light.unread) this.markRead({ ...full, author: full.author ?? light.author });\n } catch {\n this.loadError.set(this.text.loadError);\n }\n }\n\n protected setOpen(open: boolean): void {\n if (!open) this.closed.emit();\n }\n\n /** Aplica a versão do servidor aqui e avisa o quadro. */\n private apply(task: AutoServiceTask): void {\n const prev = this.current();\n const next = { ...task, author: task.author ?? prev?.author ?? null };\n this.current.set(next);\n this.changed.emit(next);\n }\n\n /** Roda uma mudança no servidor; erro = aviso no canto. */\n private async run(call: () => Promise<AutoServiceTask>, success?: string): Promise<boolean> {\n if (this.busy()) return false;\n this.busy.set(true);\n try {\n this.apply(await call());\n if (success) this.toast.success(success);\n if (this.tab() === 'activity') void this.loadEvents('activity', true);\n return true;\n } catch {\n this.toast.error(this.text.saveError);\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n private edit(patch: Parameters<AutoServiceSuggestionsService['update']>[2]): Promise<boolean> {\n const t = this.current();\n return t ? this.run(() => this.service.update(this.clientId(), t.id, patch)) : Promise.resolve(false);\n }\n\n // --- título e descrição ---\n\n protected startTitle(): void {\n this.titleDraft.set(this.current()?.title ?? '');\n this.editingTitle.set(true);\n }\n\n protected async saveTitle(): Promise<void> {\n const title = this.titleDraft().trim();\n if (!title || title === this.current()?.title) {\n this.editingTitle.set(false);\n return;\n }\n if (await this.edit({ title })) this.editingTitle.set(false);\n }\n\n protected onTitleKey(event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n void this.saveTitle();\n } else if (event.key === 'Escape') {\n event.stopPropagation();\n this.editingTitle.set(false);\n }\n }\n\n protected startDescription(): void {\n this.descriptionDraft.set(this.current()?.description_html ?? '');\n this.editingDescription.set(true);\n }\n\n protected async saveDescription(): Promise<void> {\n if (await this.edit({ description_html: this.descriptionDraft() })) this.editingDescription.set(false);\n }\n\n // --- campos da direita ---\n\n /** Abrir a tarefa lê a conversa: zera o \"N novas\" (aqui e no quadro); falhar não atrapalha. */\n private markRead(t: AutoServiceTask): void {\n const read = { ...t, unread: 0 };\n this.current.set(read);\n this.changed.emit(read);\n this.service.markRead(this.clientId(), t.id).catch(() => undefined);\n }\n\n /** Com quem está a vez (o servidor também muda sozinho: comentário público da equipe = quem pediu; resposta = equipe). */\n protected changeWaiting(value: string): void {\n const t = this.current();\n const waiting = (value || null) as SpineSuggestionWaiting | null;\n if (!t || waiting === (t.waiting_on ?? null)) return;\n void this.edit({ waiting_on: waiting }).then((ok) => { if (ok) this.toast.success(this.text.waitingSaved); });\n }\n\n /** Os rótulos na linha de selos, cada um com a cor do token ('cat-3' → 3). */\n protected labelTags(t: AutoServiceTask): SpineTagRowItem[] {\n return t.labels.map((l) => ({ id: l.id, name: l.name, color: Number(l.color.replace('cat-', '')) || undefined }));\n }\n\n protected unreadText(count: number): string {\n return pluralMessage(this.text.unread, count, this.messages.meta.locale);\n }\n\n\n protected changeStatus(status: string): void {\n const t = this.current();\n if (!t || status === t.status) return;\n void this.run(() => this.service.move(this.clientId(), t.id, { status: status as SpineSuggestionStatus }), this.text.statusSaved);\n }\n\n protected changeKind(kind: string): void {\n if (kind !== this.current()?.kind) void this.edit({ kind: kind as SpineSuggestionKind });\n }\n\n protected changePriority(priority: string): void {\n if (priority !== this.current()?.priority) void this.edit({ priority: priority as TaskPriority });\n }\n\n protected changeDate(field: 'start_date' | 'due_date', value: string | null): void {\n const t = this.current();\n if (!t || (value || null) === t[field]) return;\n void this.edit({ [field]: value || null });\n }\n\n protected toggleChecklistOnCard(on: boolean): void {\n if (on !== this.current()?.checklist_on_card) void this.edit({ checklist_on_card: on });\n }\n\n protected assignMe(): void {\n const t = this.current();\n if (t) void this.run(() => this.service.addPerson(this.clientId(), t.id, 'me', 'responsavel'), this.text.assignedToMe);\n }\n\n protected addPerson(person: TaskPersonOption, role: TaskRole, popover: PopoverComponent): void {\n popover.close();\n const t = this.current();\n if (t) void this.run(() => this.service.addPerson(this.clientId(), t.id, person.id, role));\n }\n\n protected removePerson(person: SpineSuggestionPerson, role: TaskRole): void {\n const t = this.current();\n if (t) void this.run(() => this.service.removePerson(this.clientId(), t.id, person.user_id, role));\n }\n\n protected toggleLabel(label: TaskCatalogLabel, linked: boolean): void {\n const t = this.current();\n if (!t) {\n this.draftLabels.update((ids) => (linked ? [...new Set([...ids, label.id])] : ids.filter((id) => id !== label.id)));\n return;\n }\n void this.run(() => this.service.setLabel(this.clientId(), t.id, label.id, linked));\n }\n\n protected async createLabel(name: string, color: string): Promise<void> {\n try {\n const label = await this.service.createLabel(this.clientId(), name, color);\n const entry: TaskCatalogLabel = { ...label, uses: 0 };\n this.labelCreated.emit(entry);\n this.toggleLabel(entry, true);\n } catch {\n this.toast.error(this.text.saveError);\n }\n }\n\n protected async copyKey(): Promise<void> {\n const t = this.current();\n if (!t) return;\n if (await copyText(t.key)) this.toast.success(this.text.keyCopied);\n else this.toast.error(this.text.copyError);\n }\n\n protected screenHref(path: string): string {\n return this.location?.prepareExternalUrl(path) ?? path;\n }\n\n /** Clique simples navega no app (e fecha); com Ctrl/Cmd/Shift ou botão do meio, o navegador abre a aba. */\n protected openScreen(event: MouseEvent, path: string): void {\n if (!this.router || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;\n event.preventDefault();\n this.closed.emit();\n void this.router.navigateByUrl(path);\n }\n\n protected toggleArchived(): void {\n const t = this.current();\n if (!t) return;\n const archive = !t.archived_at;\n void this.run(() => this.service.setArchived(this.clientId(), t.id, archive), archive ? this.text.archivedToast : this.text.restoredToast);\n }\n\n protected async remove(): Promise<void> {\n const t = this.current();\n if (!t) return;\n const ok = await this.dialogs.confirm({\n heading: formatMessage(this.text.deleteHeading, { key: t.key }), message: this.text.deleteMessage,\n confirmLabel: this.text.deleteConfirm, danger: true,\n });\n if (!ok) return;\n try {\n await this.service.remove(this.clientId(), t.id);\n this.toast.success(this.text.deleted);\n this.removed.emit(t);\n } catch {\n this.toast.error(this.text.saveError);\n }\n }\n\n // --- agrupar ---\n\n /** Desagrupa esta (a agrupada): ela volta ao quadro. */\n protected async unmergeSelf(): Promise<void> {\n const t = this.current();\n if (!t?.merged_into || this.busy()) return;\n if (await this.run(() => this.service.unmerge(this.clientId(), t.id), formatMessage(this.text.unmergedToast, { key: t.key }))) {\n this.unmerged.emit();\n }\n }\n\n /** Desagrupa uma das agrupadas nesta: relê esta (perde os relatores e apoios que vieram dela). */\n protected async unmergeOrigin(origin: TaskMergedOrigin): Promise<void> {\n const t = this.current();\n if (!t) return;\n const ok = await this.run(async () => {\n await this.service.unmerge(this.clientId(), origin.id);\n return this.service.task(this.clientId(), t.id);\n }, formatMessage(this.text.unmergedToast, { key: origin.key }));\n if (ok) this.unmerged.emit();\n }\n\n /** Quem pediu: o autor e os relatores extras (do detalhe); sem a lista ainda, só o autor. */\n protected reportersOf(t: AutoServiceTask): TaskReporter[] {\n if (t.reporters?.length) return t.reporters;\n return [{ ...(t.author ?? { user_id: '', username: null, name: null, picture: null }), role: 'author', from_suggestion_id: null }];\n }\n\n /** \"Autor\" ou \"via SUG-30\" (a agrupada de onde o relator veio). */\n protected reporterHint(t: AutoServiceTask, r: TaskReporter): string {\n if (r.role === 'author') return this.text.reporterAuthor;\n const origin = t.merged?.find((m) => m.id === r.from_suggestion_id);\n return origin ? formatMessage(this.text.reporterVia, { key: origin.key }) : '';\n }\n\n protected mergedIntoText(key: string): string {\n return formatMessage(this.text.mergedInto, { key });\n }\n\n protected openMergedText(key: string): string {\n return formatMessage(this.text.openMerged, { key });\n }\n\n protected unmergeLabel(key: string): string {\n return formatMessage(this.text.unmergeLabel, { key });\n }\n\n // --- checklist ---\n\n protected addItem(): void {\n const t = this.current();\n const text = this.newItem().trim();\n if (!t || !text) return;\n void this.run(() => this.service.addChecklistItem(this.clientId(), t.id, text)).then((ok) => ok && this.newItem.set(''));\n }\n\n protected onNewItemKey(event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.addItem();\n }\n }\n\n protected toggleItem(item: TaskChecklistItem, done: boolean): void {\n const t = this.current();\n if (t && done !== item.done) void this.run(() => this.service.updateChecklistItem(this.clientId(), t.id, item.id, { done }));\n }\n\n protected startRename(item: TaskChecklistItem): void {\n this.renaming.set(item.id);\n this.renameDraft.set(item.text);\n }\n\n protected saveRename(item: TaskChecklistItem): void {\n const text = this.renameDraft().trim();\n this.renaming.set(null);\n const t = this.current();\n if (t && text && text !== item.text) void this.run(() => this.service.updateChecklistItem(this.clientId(), t.id, item.id, { text }));\n }\n\n protected onRenameKey(event: KeyboardEvent, item: TaskChecklistItem): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.saveRename(item);\n } else if (event.key === 'Escape') {\n event.stopPropagation();\n this.renaming.set(null);\n }\n }\n\n protected moveItem(item: TaskChecklistItem, delta: -1 | 1): void {\n const t = this.current();\n const index = this.checklistItems().findIndex((i) => i.id === item.id);\n const target = index + delta;\n if (!t || index < 0 || target < 0 || target >= this.checklistItems().length) return;\n void this.run(() => this.service.updateChecklistItem(this.clientId(), t.id, item.id, { position: target }));\n }\n\n protected removeItem(item: TaskChecklistItem): void {\n const t = this.current();\n if (t) void this.run(() => this.service.removeChecklistItem(this.clientId(), t.id, item.id));\n }\n\n // --- comentários e atividades ---\n\n protected selectTab(tab: string): void {\n const next = tab === 'activity' || tab === 'comments' ? tab : 'summary';\n this.tab.set(next);\n if (next === 'summary') return;\n if (!this.loadedTabs.has(next)) void this.loadEvents(next, true);\n }\n\n protected async loadEvents(type: 'comments' | 'activity', reset: boolean): Promise<void> {\n const t = this.current();\n if (!t) return;\n const list = type === 'comments' ? this.comments : this.activity;\n const total = type === 'comments' ? this.commentsTotal : this.activityTotal;\n this.eventsLoading.set(true);\n try {\n const res = await this.service.events(this.clientId(), t.id, { type, limit: EVENTS_PAGE, offset: reset ? 0 : list().length });\n if (this.current()?.id !== t.id) return;\n list.set(reset ? res.events : [...list(), ...res.events]);\n total.set(res.total);\n this.loadedTabs.add(type);\n } catch {\n this.loadError.set(this.text.loadError);\n } finally {\n this.eventsLoading.set(false);\n }\n }\n\n protected async sendComment(text?: string): Promise<void> {\n const t = this.current();\n const comment = (text ?? this.comment()).trim();\n if (!t || this.commenting()) return;\n this.commentError.set(comment ? '' : this.text.commentRequired);\n if (!comment) return;\n this.commenting.set(true);\n try {\n const event = await this.service.comment(this.clientId(), t.id, comment, this.commentInternal());\n this.comments.update((list) => [event, ...list]);\n this.commentsTotal.update((n) => n + 1);\n this.comment.set('');\n this.commentInternal.set(false);\n const updated = {\n ...t, comments_count: t.comments_count + 1,\n last_activity: { at: event.created_at, actor: event.actor },\n ...(event.internal ? {} : { last_comment: { comment: event.comment ?? comment, created_at: event.created_at } }),\n ...(event.internal || t.status === 'concluida' || t.status === 'recusada'\n ? {} : { waiting_on: 'solicitante' as const, waiting_since: event.created_at }),\n };\n this.current.set(updated);\n this.changed.emit(updated);\n this.chat()?.scrollToEnd();\n } catch {\n this.commentError.set(this.text.commentError);\n } finally {\n this.commenting.set(false);\n }\n }\n\n // --- nova tarefa ---\n\n protected async create(): Promise<void> {\n const title = this.draftTitle().trim();\n this.draftTitleError.set(title ? '' : this.text.titleRequired);\n if (!title || this.busy()) return;\n this.busy.set(true);\n try {\n const task = await this.service.create(this.clientId(), {\n title, kind: this.draftKind() as SpineSuggestionKind, status: this.draftColumn() as SpineSuggestionStatus,\n priority: this.draftPriority() as TaskPriority, start_date: this.draftStart(), due_date: this.draftDue(),\n description_html: this.draftDescription(), label_ids: this.draftLabels(),\n people: this.draftAssignMe() ? [{ user_id: 'me', role: 'responsavel' }] : [],\n });\n this.toast.success(this.text.taskCreated);\n this.created.emit(task);\n } catch {\n this.toast.error(this.text.createError);\n } finally {\n this.busy.set(false);\n }\n }\n\n // --- textos ---\n\n protected personName(p: SpineSuggestionPerson | null | undefined): string {\n return p?.name || p?.username || this.text.removedAuthor;\n }\n\n protected statusLabel(status: string | null): string {\n if (!status) return '—';\n return (this.text.statuses as Record<string, string>)[status] ?? (this.text.legacyStatuses as Record<string, string>)[status] ?? status;\n }\n\n /** O valor de um evento 'change' legível: prioridade e tipo pelo catálogo, data no formato local. */\n private valueText(field: string | null | undefined, value: string | null | undefined): string {\n if (!value) return '—';\n if (field === 'priority') return (this.text.priorities as Record<string, string>)[value] ?? value;\n if (field === 'kind') return (this.text.kinds as Record<string, string>)[value] ?? value;\n if (field === 'start_date' || field === 'due_date') return this.day(value);\n return value;\n }\n\n protected eventText(e: AutoServiceSuggestionEvent): string {\n const actor = e.actor ? this.personName(e.actor) : this.text.someone;\n if (e.kind === 'comment') return formatMessage(this.text.eventComment, { actor });\n if (e.kind === 'status') return formatMessage(this.text.eventStatus, { actor, from: this.statusLabel(e.from_status), to: this.statusLabel(e.to_status) });\n const field = e.field ?? 'other';\n const removed = ['start_date', 'due_date', 'cover'].includes(field) && !e.to_value ? `${field}_removed` : field;\n const template = (this.text.activity as Record<string, string>)[removed] ?? this.text.activity.other;\n return formatMessage(template, { actor, from: this.valueText(e.field, e.from_value), to: this.valueText(e.field, e.to_value) });\n }\n\n protected lastChange(t: AutoServiceTask): string {\n if (!t.last_activity) return '';\n const when = this.age(t.last_activity.at);\n return t.last_activity.actor\n ? formatMessage(this.text.lastChange, { when, actor: this.personName(t.last_activity.actor) })\n : formatMessage(this.text.lastChangeNoActor, { when });\n }\n\n protected dueText(t: AutoServiceTask): string {\n if (!t.due_date) return '';\n const s = this.dueSituation();\n if (s === 'overdue') return formatMessage(this.text.dueLate, { date: this.day(t.due_date) });\n if (s === 'today') return this.text.dueToday;\n if (s === 'tomorrow') return this.text.dueTomorrow;\n return formatMessage(this.text.dueOn, { date: this.day(t.due_date) });\n }\n\n protected removePersonLabel(p: SpineSuggestionPerson): string {\n return formatMessage(this.text.removePerson, { name: this.personName(p) });\n }\n\n protected itemLabel(template: string, item: TaskChecklistItem): string {\n return formatMessage(template, { text: item.text });\n }\n\n protected age(iso: string): string {\n const seconds = Math.round((Date.now() - new Date(iso).getTime()) / 1000);\n const units: Array<[Intl.RelativeTimeFormatUnit, number]> = [['year', 31_536_000], ['month', 2_592_000], ['week', 604_800], ['day', 86_400], ['hour', 3_600], ['minute', 60]];\n try {\n const rtf = new Intl.RelativeTimeFormat(this.messages.meta.locale, { numeric: 'auto' });\n for (const [unit, size] of units) if (Math.abs(seconds) >= size) return rtf.format(-Math.floor(seconds / size), unit);\n return rtf.format(0, 'minute');\n } catch {\n return this.date(iso);\n }\n }\n\n protected date(iso: string, withTime = false): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, {\n dateStyle: 'short', ...(withTime ? { timeStyle: 'short' as const } : {}), timeZone: this.preferences.effectiveTimeZone(),\n }).format(new Date(iso));\n } catch {\n return iso.slice(0, 10);\n }\n }\n\n /** Data sem hora (AAAA-MM-DD), sem fuso: o dia é o dia. */\n protected day(iso: string): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeZone: 'UTC' }).format(new Date(`${iso}T00:00:00Z`));\n } catch {\n return iso;\n }\n }\n}\n","<hm-modal [heading]=\"heading()\" [open]=\"open()\" (openChange)=\"setOpen($event)\" size=\"xlarge\">\n @if (current(); as t) {\n @if (loadError()) {\n <hm-alert variant=\"error\">{{ loadError() }}</hm-alert>\n }\n <div class=\"as-task\">\n <!-- Esquerda: o trabalho (título, descrição, checklist, conversa). -->\n <div class=\"as-task__main\">\n <div class=\"as-task__key-row\">\n <span class=\"as-task__key\">{{ t.key }}</span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"copy\" [label]=\"text.copyKey\" (clicked)=\"copyKey()\" />\n <hm-tag [name]=\"text.kinds[t.kind]\" [color]=\"kindColors[t.kind]\" />\n @if (t.archived_at) { <hm-tag [name]=\"text.archivedTag\" /> }\n @if (t.merged_into) { <hm-tag [name]=\"text.mergedTag\" color=\"info\" /> }\n </div>\n\n <!-- Agrupada: o destino tem os relatores e os apoios; os comentários ficam aqui. -->\n @if (t.merged_into; as into) {\n <div class=\"as-task__merged\">\n <hm-icon class=\"as-task__merged-icon\" shape=\"layers\" />\n <div class=\"as-task__merged-text\">\n <strong>{{ mergedIntoText(into.key) }}</strong>\n <span>{{ into.title }}</span>\n <span class=\"as-field__hint\">{{ text.mergedIntoHint }}</span>\n </div>\n <div class=\"as-actions\">\n <hm-button size=\"small\" emphasis=\"medium\" (clicked)=\"openTask.emit(into.id)\">{{ openMergedText(into.key) }}</hm-button>\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"unlink\" [disabled]=\"busy()\" (clicked)=\"unmergeSelf()\">{{ text.unmerge }}</hm-button>\n </div>\n </div>\n }\n\n @if (editingTitle()) {\n <hm-input [label]=\"text.title\" labelHidden [maxLength]=\"limits.title\" [value]=\"titleDraft()\"\n (valueChange)=\"titleDraft.set($event)\" (keydown)=\"onTitleKey($event)\" (focusout)=\"saveTitle()\" />\n } @else {\n <h2 class=\"as-task__title\">\n <button type=\"button\" class=\"as-task__title-button\" [attr.aria-label]=\"text.editTitle + ': ' + t.title\" (click)=\"startTitle()\">\n {{ t.title }}<hm-icon class=\"as-task__title-pen\" shape=\"pencil\" />\n </button>\n </h2>\n }\n <p class=\"as-task__dates\">\n <span>{{ text.createdAt }} {{ date(t.created_at, true) }}</span>\n <span aria-hidden=\"true\">·</span>\n <span>{{ text.updatedAt }} {{ date(t.updated_at, true) }}</span>\n @if (lastChange(t); as change) {\n <span aria-hidden=\"true\">·</span>\n <span>{{ change }}</span>\n }\n </p>\n\n <!-- Abas: Resumo (descrição e checklist), Comentários (a conversa com quem pediu) e Histórico (tudo o que mudou). -->\n <hm-tabs [label]=\"text.taskLabel\" [active]=\"tab()\" (activeChange)=\"selectTab($event)\">\n <hm-tab id=\"summary\" [label]=\"text.tabSummary\">\n <div class=\"as-task__summary\">\n <section class=\"as-task__section\" aria-labelledby=\"as-task-description\">\n <div class=\"as-task__section-head\">\n <h3 id=\"as-task-description\" class=\"as-task__heading\">{{ text.description }}</h3>\n @if (!editingDescription()) {\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"pencil\" (clicked)=\"startDescription()\">{{ text.editDescription }}</hm-button>\n }\n </div>\n @if (editingDescription()) {\n <hm-rich-text [label]=\"text.description\" labelHidden [rows]=\"6\" [maxRows]=\"20\" [value]=\"descriptionDraft()\"\n (valueChange)=\"descriptionDraft.set($event)\" />\n <div class=\"as-actions\">\n <hm-button emphasis=\"medium\" (clicked)=\"editingDescription.set(false)\">{{ text.cancel }}</hm-button>\n <hm-button [loading]=\"busy()\" (clicked)=\"saveDescription()\">{{ text.save }}</hm-button>\n </div>\n } @else if (t.description_html) {\n <hm-rich-text class=\"as-task__description\" [label]=\"text.description\" labelHidden readonly hideToolbar [value]=\"t.description_html\" />\n } @else {\n <p class=\"muted\">{{ text.noDescription }}</p>\n }\n </section>\n \n <section class=\"as-task__section\" aria-labelledby=\"as-task-checklist\">\n <div class=\"as-task__section-head\">\n <h3 id=\"as-task-checklist\" class=\"as-task__heading\">\n {{ text.checklist }}\n @if (t.checklist.total) {\n <span class=\"as-task__count\">{{ t.checklist.done }}/{{ t.checklist.total }}</span>\n <span class=\"as-task__progress\" role=\"progressbar\" aria-valuemin=\"0\" [attr.aria-valuemax]=\"t.checklist.total\"\n [attr.aria-valuenow]=\"t.checklist.done\" [attr.aria-label]=\"text.checklist\">\n <span [style.inline-size.%]=\"(t.checklist.done / t.checklist.total) * 100\"></span>\n </span>\n }\n </h3>\n <hm-switch [label]=\"text.checklistOnCard\" [value]=\"t.checklist_on_card\" (valueChange)=\"toggleChecklistOnCard($event)\" />\n </div>\n <ul class=\"as-checklist\">\n @for (item of checklistItems(); track item.id; let first = $first; let last = $last) {\n <li class=\"as-checklist__item\" [class.as-checklist__item--done]=\"item.done\">\n @if (renaming() === item.id) {\n <hm-input class=\"as-checklist__rename\" [label]=\"text.checklist\" labelHidden [maxLength]=\"500\" [value]=\"renameDraft()\"\n (valueChange)=\"renameDraft.set($event)\" (keydown)=\"onRenameKey($event, item)\" (focusout)=\"saveRename(item)\" />\n } @else {\n <hm-checkbox class=\"as-checklist__check\" [label]=\"item.text\" [checked]=\"item.done\" (checkedChange)=\"toggleItem(item, $event)\" />\n <span class=\"as-checklist__tools\">\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"pencil\" [label]=\"text.editTitle + ': ' + item.text\" (clicked)=\"startRename(item)\" />\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"angle-up\" [label]=\"itemLabel(text.checklistUp, item)\" [disabled]=\"first\" (clicked)=\"moveItem(item, -1)\" />\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"angle-down\" [label]=\"itemLabel(text.checklistDown, item)\" [disabled]=\"last\" (clicked)=\"moveItem(item, 1)\" />\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"trash\" [label]=\"itemLabel(text.checklistRemove, item)\" (clicked)=\"removeItem(item)\" />\n </span>\n }\n </li>\n } @empty {\n <li class=\"muted\">{{ text.checklistEmpty }}</li>\n }\n </ul>\n <div class=\"as-checklist__add\">\n <hm-input class=\"as-checklist__new\" [label]=\"text.checklistAdd\" labelHidden [placeholder]=\"text.checklistPlaceholder\"\n [maxLength]=\"500\" [value]=\"newItem()\" (valueChange)=\"newItem.set($event)\" (keydown)=\"onNewItemKey($event)\" />\n <hm-button emphasis=\"medium\" icon=\"plus\" [disabled]=\"!newItem().trim()\" (clicked)=\"addItem()\">{{ text.checklistAdd }}</hm-button>\n </div>\n </section>\n </div>\n </hm-tab>\n <hm-tab id=\"comments\" [label]=\"text.tabComments\" [count]=\"commentsTotal() || null\">\n <!-- A conversa em chat: à direita o que a pessoa escreveu como equipe; quem pediu (inclusive ela mesma pela\n página de quem pede) à esquerda, com o papel no cabeçalho. O \"Só para a equipe\" vai junto do Enviar. -->\n <spine-suggestion-chat class=\"as-task__chat\" side=\"equipe\" [me]=\"me()\" [items]=\"chatItems()\"\n [label]=\"text.tabComments\" [empty]=\"text.commentsEmpty\"\n [hasMore]=\"comments().length < commentsTotal()\" [loading]=\"eventsLoading()\"\n [composerLabel]=\"text.comment\" [placeholder]=\"commentInternal() ? text.commentInternal : text.commentHint\"\n [sendLabel]=\"text.commentSend\" [sending]=\"commenting()\" [error]=\"commentError()\"\n [(draft)]=\"comment\" (loadHistory)=\"loadEvents('comments', false)\" (send)=\"sendComment($event)\">\n <hm-checkbox spineChatComposer [label]=\"text.commentInternal\" [checked]=\"commentInternal()\"\n (checkedChange)=\"commentInternal.set($event)\" />\n </spine-suggestion-chat>\n </hm-tab>\n <hm-tab id=\"activity\" [label]=\"text.tabActivity\">\n <ol class=\"as-timeline\">\n @for (e of activity(); track e.id) {\n <li class=\"as-timeline__item\">\n <hm-account-avatar class=\"as-timeline__face\" size=\"small\" [name]=\"e.actor ? personName(e.actor) : text.someone\" [imageUrl]=\"e.actor?.picture\" />\n <div class=\"as-timeline__body\">\n <span class=\"as-timeline__line\">{{ eventText(e) }} ·\n <time class=\"muted\" [attr.datetime]=\"e.created_at\" [attr.title]=\"date(e.created_at, true)\">{{ age(e.created_at) }}</time>\n </span>\n @if (e.comment) {\n <p class=\"as-timeline__comment\" [class.as-timeline__comment--internal]=\"e.internal\">{{ e.comment }}</p>\n }\n </div>\n </li>\n } @empty {\n @if (!eventsLoading()) { <li class=\"muted\">{{ text.activityEmpty }}</li> }\n }\n </ol>\n @if (activity().length < activityTotal()) {\n <hm-button emphasis=\"medium\" [loading]=\"eventsLoading()\" (clicked)=\"loadEvents('activity', false)\">{{ text.loadMore }}</hm-button>\n }\n </hm-tab>\n </hm-tabs>\n </div>\n\n <!-- Direita: os campos da tarefa (cada mudança grava na hora). -->\n <aside class=\"as-task__side\" [attr.aria-label]=\"text.taskLabel\">\n <hm-select [label]=\"text.status\" [value]=\"t.status\" [disabled]=\"busy()\" (valueChange)=\"changeStatus($any($event))\">\n @for (st of statuses; track st) { <option [value]=\"st\">{{ text.statuses[st] }}</option> }\n </hm-select>\n <!-- A conversa com quem pede: com quem está a vez (muda sozinho a cada mensagem; aqui dá para acertar). -->\n <hm-select [label]=\"text.menuWaiting\" [value]=\"t.waiting_on ?? ''\" [disabled]=\"busy()\" (valueChange)=\"changeWaiting($any($event))\">\n <option value=\"\">{{ text.waitingClear }}</option>\n @for (w of waitingValues; track w) { <option [value]=\"w\">{{ text.waiting[w] }}</option> }\n </hm-select>\n\n <div class=\"as-field\">\n <div class=\"as-field__head\">\n <span class=\"as-field__label\">{{ text.assignees }}</span>\n @if (!isMine()) {\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"user-plus\" (clicked)=\"assignMe()\">{{ text.assignMe }}</hm-button>\n }\n </div>\n <ul class=\"as-people\">\n @for (p of t.assignees; track p.user_id) {\n <li class=\"as-people__item\">\n <hm-account-avatar size=\"small\" [name]=\"personName(p)\" [imageUrl]=\"p.picture\" />\n <span class=\"as-people__name\">{{ personName(p) }}</span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"trash\" [label]=\"removePersonLabel(p)\" (clicked)=\"removePerson(p, 'responsavel')\" />\n </li>\n } @empty {\n <li class=\"muted\">{{ text.nobody }}</li>\n }\n </ul>\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"plus\" [hmPopoverTrigger]=\"assigneePop\">{{ text.addAssignee }}</hm-button>\n <hm-popover #assigneePop [label]=\"text.addAssignee\">\n @if (assigneePop.open()) {\n <spine-suggestion-people-picker [clientId]=\"clientId()\" [exclude]=\"assigneeIds()\" (picked)=\"addPerson($event, 'responsavel', assigneePop)\" />\n }\n </hm-popover>\n </div>\n\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ text.watchers }}</span>\n <ul class=\"as-people\">\n @for (p of t.watchers; track p.user_id) {\n <li class=\"as-people__item\">\n <hm-account-avatar size=\"small\" [name]=\"personName(p)\" [imageUrl]=\"p.picture\" />\n <span class=\"as-people__name\">{{ personName(p) }}</span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"trash\" [label]=\"removePersonLabel(p)\" (clicked)=\"removePerson(p, 'envolvido')\" />\n </li>\n } @empty {\n <li class=\"muted\">{{ text.nobody }}</li>\n }\n </ul>\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"plus\" [hmPopoverTrigger]=\"watcherPop\">{{ text.addWatcher }}</hm-button>\n <hm-popover #watcherPop [label]=\"text.addWatcher\">\n @if (watcherPop.open()) {\n <spine-suggestion-people-picker [clientId]=\"clientId()\" [exclude]=\"watcherIds()\" (picked)=\"addPerson($event, 'envolvido', watcherPop)\" />\n }\n </hm-popover>\n </div>\n\n <!-- Quem pediu: o autor e, numa que recebeu agrupadas, os relatores que vieram delas. -->\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ (t.reporters?.length ?? 0) > 1 ? text.reporters : text.reporter }}</span>\n <ul class=\"as-people\">\n @for (p of reportersOf(t); track p.user_id || $index) {\n <li class=\"as-people__item\">\n <hm-account-avatar size=\"small\" [name]=\"personName(p.user_id ? p : null)\" [imageUrl]=\"p.picture\" />\n <span class=\"as-people__name\">{{ personName(p.user_id ? p : null) }}</span>\n @if ((t.reporters?.length ?? 0) > 1 && reporterHint(t, p); as hint) {\n <span class=\"as-field__hint\">{{ hint }}</span>\n }\n </li>\n }\n </ul>\n <span class=\"as-field__hint\">{{ t.origin === 'equipe' ? text.originTeam : text.originUser }}</span>\n </div>\n\n @if (t.merged?.length) {\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ text.mergedHere }}</span>\n <ul class=\"as-merged\">\n @for (m of t.merged; track m.id) {\n <li class=\"as-merged__item\">\n <button type=\"button\" class=\"as-merged__link\" (click)=\"openTask.emit(m.id)\">\n <span class=\"as-task__key\">{{ m.key }}</span> {{ m.title }}\n </button>\n <span class=\"as-merged__author\">\n <hm-account-avatar size=\"small\" [name]=\"personName(m.author)\" [imageUrl]=\"m.author?.picture\" />\n {{ personName(m.author) }}\n </span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"unlink\" [label]=\"unmergeLabel(m.key)\"\n [disabled]=\"busy()\" (clicked)=\"unmergeOrigin(m)\" />\n </li>\n }\n </ul>\n </div>\n }\n\n <hm-select [label]=\"text.priority\" [value]=\"t.priority\" [disabled]=\"busy()\" (valueChange)=\"changePriority($any($event))\">\n @for (p of priorities; track p) { <option [value]=\"p\">{{ text.priorities[p] }}</option> }\n </hm-select>\n <hm-select [label]=\"text.kind\" [value]=\"t.kind\" [disabled]=\"busy()\" (valueChange)=\"changeKind($any($event))\">\n @for (k of kinds; track k) { <option [value]=\"k\">{{ text.kinds[k] }}</option> }\n </hm-select>\n <div class=\"as-field__dates\">\n <hm-date-picker [label]=\"text.startDate\" [value]=\"t.start_date\" [max]=\"$any(t.due_date)\" (valueChange)=\"changeDate('start_date', $event)\" />\n <hm-date-picker [label]=\"text.dueDate\" [value]=\"t.due_date\" [min]=\"$any(t.start_date)\" (valueChange)=\"changeDate('due_date', $event)\" />\n </div>\n @if (t.due_date) {\n <span class=\"as-due\" [attr.data-due]=\"dueSituation()\"><hm-icon shape=\"calendar\" />{{ dueText(t) }}</span>\n }\n\n <div class=\"as-field\">\n <div class=\"as-field__head\">\n <span class=\"as-field__label\">{{ text.labels }}</span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"tag\" [label]=\"text.addLabel\" [hmPopoverTrigger]=\"labelPop\" />\n </div>\n <!-- Em linha, como os grupos: o que não cabe vira \"+N\" (cada rótulo na cor dele). -->\n <spine-tag-row [label]=\"text.labels\" [items]=\"labelTags(t)\" [empty]=\"text.noLabels\" />\n <hm-popover #labelPop [label]=\"text.labels\">\n @if (labelPop.open()) {\n <spine-suggestion-label-picker [labels]=\"labels()\" [selected]=\"selectedLabels()\"\n (toggled)=\"toggleLabel($event.label, $event.linked)\" (created)=\"createLabel($event.name, $event.color)\" />\n }\n </hm-popover>\n </div>\n\n <dl class=\"as-facts\">\n <dt>{{ text.screenOrigin }}</dt>\n <dd class=\"as-facts__screen\">\n @if (t.screen.new) { <hm-tag [name]=\"text.newScreenTag\" color=\"info\" /> }\n <span class=\"as-facts__screen-name\" [attr.title]=\"t.screen.label || null\">{{ t.screen.label || text.noScreen }}</span>\n @if (t.screen.path && canOpenScreen()) {\n <a class=\"as-facts__link\" [href]=\"screenHref(t.screen.path)\" [attr.aria-label]=\"text.openScreen\" [attr.title]=\"text.openScreen\"\n (click)=\"openScreen($event, t.screen.path)\"><hm-icon shape=\"pop-out\" /></a>\n }\n </dd>\n <dt>{{ text.votesField }}</dt>\n <dd>{{ t.votes }}</dd>\n </dl>\n\n <!-- Os grupos de quem pediu: em linha, no modelo dos rótulos; o que não cabe vira \"+N\". -->\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ text.requestingGroups }}</span>\n <spine-tag-row [label]=\"text.requestingGroups\" [items]=\"t.groups ?? []\" [empty]=\"text.noGroups\" />\n </div>\n\n <div class=\"as-task__danger\">\n <!-- Sem cadeia: nem a agrupada nem a que recebeu outras vão para dentro de outra. -->\n @if (!t.merged_into && !t.merged_count) {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"layers\" (clicked)=\"mergeRequested.emit(t)\">{{ text.menuMerge }}</hm-button>\n }\n <hm-button size=\"small\" emphasis=\"medium\" [icon]=\"t.archived_at ? 'unarchive' : 'archive'\" (clicked)=\"toggleArchived()\">\n {{ t.archived_at ? text.menuRestore : text.menuArchive }}\n </hm-button>\n <hm-button size=\"small\" emphasis=\"medium\" intent=\"danger\" icon=\"trash\" (clicked)=\"remove()\">{{ text.menuDelete }}</hm-button>\n </div>\n </aside>\n </div>\n } @else if (draft()) {\n <!-- Nova tarefa: o essencial; o resto (pessoas, checklist, conversa) assim que existir. -->\n <div class=\"as-task\">\n <div class=\"as-task__main\">\n <hm-input [label]=\"text.title\" [placeholder]=\"text.addTaskPlaceholder\" [maxLength]=\"limits.title\" required\n [error]=\"draftTitleError()\" [value]=\"draftTitle()\" (valueChange)=\"draftTitle.set($event)\" />\n <hm-rich-text [label]=\"text.description\" [rows]=\"6\" [maxRows]=\"20\" [value]=\"draftDescription()\" (valueChange)=\"draftDescription.set($event)\" />\n <p class=\"as-field__hint\">{{ text.draftHint }}</p>\n </div>\n <aside class=\"as-task__side\" [attr.aria-label]=\"text.taskLabel\">\n <hm-select [label]=\"text.status\" [value]=\"draftColumn()\" (valueChange)=\"draftColumn.set($any($event))\">\n @for (st of statuses; track st) { <option [value]=\"st\">{{ text.statuses[st] }}</option> }\n </hm-select>\n <hm-select [label]=\"text.kind\" [value]=\"draftKind()\" (valueChange)=\"draftKind.set($any($event))\">\n @for (k of kinds; track k) { <option [value]=\"k\">{{ text.kinds[k] }}</option> }\n </hm-select>\n <hm-select [label]=\"text.priority\" [value]=\"draftPriority()\" (valueChange)=\"draftPriority.set($any($event))\">\n @for (p of priorities; track p) { <option [value]=\"p\">{{ text.priorities[p] }}</option> }\n </hm-select>\n <div class=\"as-field__dates\">\n <hm-date-picker [label]=\"text.startDate\" [value]=\"draftStart()\" [max]=\"$any(draftDue())\" (valueChange)=\"draftStart.set($event)\" />\n <hm-date-picker [label]=\"text.dueDate\" [value]=\"draftDue()\" [min]=\"$any(draftStart())\" (valueChange)=\"draftDue.set($event)\" />\n </div>\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ text.labels }}</span>\n <spine-suggestion-label-picker [labels]=\"labels()\" [selected]=\"draftLabels()\"\n (toggled)=\"toggleLabel($event.label, $event.linked)\" (created)=\"createLabel($event.name, $event.color)\" />\n </div>\n <hm-checkbox [label]=\"text.assignMeOnCreate\" [checked]=\"draftAssignMe()\" (checkedChange)=\"draftAssignMe.set($event)\" />\n </aside>\n </div>\n }\n\n <div footer class=\"as-task__footer\">\n @if (!current() && draft()) {\n <hm-button emphasis=\"medium\" (clicked)=\"closed.emit()\">{{ text.cancel }}</hm-button>\n <hm-button icon=\"plus\" [loading]=\"busy()\" (clicked)=\"create()\">{{ text.createTask }}</hm-button>\n } @else {\n <hm-button emphasis=\"medium\" (clicked)=\"closed.emit()\">{{ text.close }}</hm-button>\n }\n </div>\n</hm-modal>\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport {\n AlertComponent, ButtonComponent, HermesDialogService, HermesToastService, ModalComponent, SearchFieldComponent, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SPINE_SUGGESTION_STATUS_COLORS } from '@trismegisto/spine/layout';\nimport { AutoServiceSuggestionsService } from './auto-service-suggestions.service';\nimport { AutoServiceTask, TaskMergePreview } from './suggestion-task';\n\n/** Sem acento e sem caixa: \"relatório\" acha \"RELATORIO\". */\nconst fold = (s: string) => s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n\n/** Teto da lista do seletor: a busca afunila o resto. */\nconst MAX_OPTIONS = 50;\n\n/**\n * \"Agrupar em…\": escolhe a sugestão principal para uma repetida (`source`), entre as abertas do quadro (`candidates`,\n * menos ela e as já agrupadas), com busca pela chave e pelo título. Escolher pede a prévia ao servidor (\"3 apoios e 1\n * relator passam para SUG-12\"); \"Agrupar\" confirma (`HermesDialogService.confirm`) e grava. Uma sugestão que já recebeu\n * outras não pode ser agrupada (sem cadeia): o seletor avisa em vez de listar.\n */\n@Component({\n selector: 'spine-suggestion-merge-picker',\n imports: [AlertComponent, ButtonComponent, ModalComponent, SearchFieldComponent, TagComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <hm-modal [heading]=\"heading()\" [open]=\"!!source()\" (openChange)=\"onOpen($event)\">\n @if (source(); as s) {\n <div class=\"as-merge\">\n <p class=\"as-merge__intro\">{{ text.mergeIntro }}</p>\n @if (s.merged_count) {\n <hm-alert variant=\"warning\">{{ text.mergeHasMerged }}</hm-alert>\n } @else {\n <hm-search-field [label]=\"text.mergeSearch\" labelHidden [placeholder]=\"text.mergeSearch\" [landmark]=\"false\"\n [value]=\"term()\" (search)=\"term.set($event)\" />\n <ul class=\"as-merge__list\" [attr.aria-label]=\"text.mergeSearch\">\n @for (c of options(); track c.id) {\n <li>\n <button type=\"button\" class=\"as-merge__option\" [class.as-merge__option--on]=\"picked()?.id === c.id\"\n [attr.aria-pressed]=\"picked()?.id === c.id\" (click)=\"pick(c)\">\n <span class=\"as-merge__key\">{{ c.key }}</span>\n <span class=\"as-merge__title\">{{ c.title }}</span>\n <span class=\"as-merge__meta\">\n <hm-tag [name]=\"text.statuses[c.status]\" [color]=\"statusColors[c.status]\" />\n <span>{{ votesText(c.votes) }}</span>\n </span>\n </button>\n </li>\n } @empty {\n <li class=\"as-merge__empty\">{{ text.mergeNone }}</li>\n }\n </ul>\n @if (picked()) {\n <p class=\"as-merge__preview\" aria-live=\"polite\">\n @if (previewError()) { {{ text.mergePreviewError }} }\n @else if (preview(); as p) { {{ previewText(p) }} }\n @else { {{ text.mergeCalculating }} }\n </p>\n }\n }\n </div>\n }\n <div footer class=\"as-merge__footer\">\n <hm-button emphasis=\"medium\" (clicked)=\"closed.emit()\">{{ text.cancel }}</hm-button>\n <hm-button icon=\"layers\" [disabled]=\"!preview() || !!source()?.merged_count\" [loading]=\"busy()\" (clicked)=\"confirm()\">\n {{ text.mergeConfirm }}\n </hm-button>\n </div>\n </hm-modal>\n `,\n styles: [`\n .as-merge { display: flex; flex-direction: column; gap: var(--hm-space-sm); min-inline-size: 0; }\n .as-merge__intro, .as-merge__empty { margin: 0; color: var(--hm-muted); font-size: var(--hm-font-size-sm); }\n .as-merge__list {\n display: flex; flex-direction: column; gap: var(--hm-space-xxxs); max-block-size: 22rem; margin: 0; padding: 0;\n overflow: auto; list-style: none;\n }\n .as-merge__option {\n display: grid; grid-template-columns: auto 1fr; gap: var(--hm-space-micro) var(--hm-space-xs); inline-size: 100%;\n padding: var(--hm-space-xs) var(--hm-space-sm); border: var(--hm-border-hairline) solid var(--hm-border);\n border-radius: var(--hm-radius-control); background: var(--hm-surface-raised); color: var(--hm-text); font: inherit;\n text-align: start; cursor: pointer;\n }\n .as-merge__option:hover { background: var(--hm-surface-muted); }\n .as-merge__option:focus-visible { outline: var(--hm-border-thin) solid var(--hm-accent); outline-offset: var(--hm-border-thin); }\n .as-merge__option--on { border-color: var(--hm-accent); background: var(--hm-accent-subtle); }\n .as-merge__key { color: var(--hm-muted); font-size: var(--hm-font-size-xs); font-weight: var(--hm-font-weight-semibold); }\n .as-merge__title { font-weight: var(--hm-font-weight-semibold); overflow-wrap: anywhere; }\n .as-merge__meta {\n display: inline-flex; grid-column: 2; flex-wrap: wrap; align-items: center; gap: var(--hm-space-xxxs);\n color: var(--hm-muted); font-size: var(--hm-font-size-sm);\n }\n .as-merge__preview {\n margin: 0; padding: var(--hm-space-xs) var(--hm-space-sm); border-radius: var(--hm-radius-control);\n background: var(--hm-surface-muted); color: var(--hm-text);\n }\n .as-merge__footer { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--hm-space-xs); inline-size: 100%; }\n `],\n})\nexport class SuggestionMergePickerComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.suggestions;\n private readonly service = inject(AutoServiceSuggestionsService);\n private readonly dialogs = inject(HermesDialogService);\n private readonly toast = inject(HermesToastService);\n\n readonly clientId = input.required<string>();\n /** A que vai ser agrupada; null = fechado. */\n readonly source = input<AutoServiceTask | null>(null);\n /** As do quadro (o seletor tira a própria e as agrupadas). */\n readonly candidates = input<readonly AutoServiceTask[]>([]);\n\n /** Agrupou: o destino inteiro, como o servidor devolveu. */\n readonly merged = output<{ source: AutoServiceTask; target: AutoServiceTask }>();\n readonly closed = output<void>();\n\n protected readonly statusColors = SPINE_SUGGESTION_STATUS_COLORS;\n protected readonly term = signal('');\n protected readonly picked = signal<AutoServiceTask | null>(null);\n protected readonly preview = signal<TaskMergePreview | null>(null);\n protected readonly previewError = signal(false);\n protected readonly busy = signal(false);\n\n protected readonly heading = computed(() => formatMessage(this.text.mergeHeading, { key: this.source()?.key ?? '' }));\n protected readonly options = computed(() => {\n const source = this.source();\n const term = fold(this.term().trim());\n return this.candidates()\n .filter((c) => c.id !== source?.id && !c.merged_into)\n .filter((c) => !term || fold(`${c.key} ${c.title}`).includes(term))\n .slice(0, MAX_OPTIONS);\n });\n\n constructor() {\n // Cada abertura começa do zero.\n effect(() => {\n this.source();\n untracked(() => {\n this.term.set('');\n this.picked.set(null);\n this.preview.set(null);\n this.previewError.set(false);\n });\n });\n }\n\n protected onOpen(open: boolean): void {\n if (!open) this.closed.emit();\n }\n\n protected async pick(target: AutoServiceTask): Promise<void> {\n const source = this.source();\n if (!source || this.picked()?.id === target.id) return;\n this.picked.set(target);\n this.preview.set(null);\n this.previewError.set(false);\n try {\n const preview = await this.service.mergePreview(this.clientId(), source.id, target.id);\n if (this.picked()?.id === target.id) this.preview.set(preview);\n } catch {\n if (this.picked()?.id === target.id) this.previewError.set(true);\n }\n }\n\n protected previewText(p: TaskMergePreview): string {\n const locale = this.messages.meta.locale;\n return formatMessage(this.text.mergePreview, {\n votes: pluralMessage(this.text.votes, p.votes, locale),\n reporters: pluralMessage(this.text.reportersCount, p.reporters, locale),\n key: p.target.key,\n });\n }\n\n protected votesText(count: number): string {\n return pluralMessage(this.text.votes, count, this.messages.meta.locale);\n }\n\n protected async confirm(): Promise<void> {\n const source = this.source();\n const preview = this.preview();\n const target = this.picked();\n if (!source || !preview || !target || this.busy()) return;\n const ok = await this.dialogs.confirm({\n heading: formatMessage(this.text.mergeConfirmHeading, { key: source.key, target: target.key }),\n message: `${this.previewText(preview)} ${this.text.mergeConfirmMessage}`,\n confirmLabel: this.text.mergeConfirm,\n });\n if (!ok) return;\n this.busy.set(true);\n try {\n const saved = await this.service.merge(this.clientId(), source.id, target.id);\n this.toast.success(formatMessage(this.text.mergedToast, { key: source.key, target: target.key }));\n this.merged.emit({ source, target: saved });\n } catch {\n this.toast.error(this.text.mergeError);\n } finally {\n this.busy.set(false);\n }\n }\n}\n","import { Location } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AUTH_CONFIG } from '@orfeu/angular/core';\nimport {\n AccountAvatarComponent, AlertComponent, ButtonComponent, EmptyComponent, HermesDialogService, HermesToastService,\n IconButtonComponent, IconComponent, KanbanCardDirective, KanbanColumn, KanbanColumnActionsDirective,\n KanbanColumnEmptyDirective, KanbanColumnFooterDirective, KanbanColumnSummaryDirective, KanbanComponent, KanbanMoveEvent,\n MenuButtonComponent, PaginatorComponent, SearchFieldComponent, SegmentedControlComponent, SegmentedOption,\n SelectComponent, TagComponent,\n} from '@trismegisto/angular';\nimport { MenuItem, PaginationState, formatMessage, pluralMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES, SpinePreferencesService, SpineUserStorage } from '@trismegisto/spine';\nimport {\n NEW_SCREEN_VALUE, SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_KIND_ICONS, SPINE_SUGGESTION_KINDS,\n SPINE_SUGGESTION_STATUS_COLORS, SPINE_SUGGESTION_STATUS_ICONS, SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_WAITING,\n SPINE_SUGGESTION_WAITING_COLORS, SpineSuggestionPerson, SpineSuggestionStatus, SpineSuggestionWaiting, SpineTagRowComponent,\n SpineTagRowItem, screenName,\n} from '@trismegisto/spine/layout';\nimport {\n AUTO_SERVICE_SUGGESTION_DONE_DAYS, AutoServiceSuggestionsService,\n} from './auto-service-suggestions.service';\nimport { SuggestionTaskDetailComponent, copyText } from './suggestion-task-detail.component';\nimport { SuggestionMergePickerComponent } from './suggestion-merge.component';\nimport {\n AutoServiceTask, DueState, TASK_PRIORITIES, TASK_PRIORITY_ICONS, TaskCatalogLabel, TaskChecklistItem, TaskPriority,\n addDays, assignedTo, daysBetween, dueState, splitDuration, todayIso,\n} from './suggestion-task';\n\ntype Mode = 'board' | 'archive';\ntype SortKey = 'position' | 'votes' | 'recent' | 'priority' | 'due';\n\n/** As colunas do quadro: recusada não tem coluna (sai na hora; fica no arquivo). */\nconst BOARD_STATUSES = ['em_analise', 'planejada', 'em_desenvolvimento', 'concluida'] as const satisfies readonly SpineSuggestionStatus[];\nconst OPEN_STATUSES: readonly SpineSuggestionStatus[] = ['em_analise', 'planejada', 'em_desenvolvimento'];\n/** Quantas levam o selo \"Mais votada\" (das com algum apoio, no quadro inteiro, não só no filtrado). */\nconst TOP_VOTED = 3;\n/** Responsáveis que aparecem no cartão; o resto vira \"+N\". */\nconst FACES = 3;\nconst ARCHIVE_PAGE = 20;\nconst EXCERPT = 140;\n/** Parâmetro do link copiado (\"?sugestao=SUG-12\"): abrir a tela com ele abre a tarefa. */\nexport const SUGGESTION_LINK_PARAM = 'sugestao';\n\nconst PRIORITY_RANK: Record<TaskPriority, number> = { urgente: 0, alta: 1, media: 2, baixa: 3 };\nconst byPosition = (a: AutoServiceTask, b: AutoServiceTask) => a.position - b.position || a.created_at.localeCompare(b.created_at);\nconst SORTS: Record<SortKey, (a: AutoServiceTask, b: AutoServiceTask) => number> = {\n position: byPosition,\n votes: (a, b) => b.votes - a.votes || byPosition(a, b),\n recent: (a, b) => b.created_at.localeCompare(a.created_at),\n priority: (a, b) => PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority] || byPosition(a, b),\n due: (a, b) => (a.due_date ?? '9999').localeCompare(b.due_date ?? '9999') || byPosition(a, b),\n};\n\n/** Sem acento e minúsculo: \"analise\" acha \"Análise\". */\nconst fold = (s: string) => s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n\n/** Intervalos do \"há 3 dias\" (segundos por unidade), do maior para o menor. */\nconst AGES: ReadonlyArray<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31_536_000], ['month', 2_592_000], ['week', 604_800], ['day', 86_400], ['hour', 3_600], ['minute', 60],\n];\n\n/**\n * O quadro de trabalho das sugestões do app (`hm-kanban`), montado na tela Sugestões do auto-serviço.\n *\n * - **Quadro**: o servidor manda o recorte (`board=true`): abertas e as concluídas dos últimos `done_days` dias;\n * recusadas e arquivadas saem. Indicadores do quadro inteiro, tudo calculado aqui com o que já vem (vencidas e as\n * que venceram ontem, vencendo em breve, em andamento por status, concluídas na janela e hoje, atribuídas a mim e as\n * abertas por prioridade; vencidas, vencendo, minhas e cada prioridade também filtram) e os filtros da tela — texto\n * (inclusive a chave \"SUG-12\"), responsável (\"minhas\", \"sem responsável\"), tipo, status (só aquela coluna),\n * prioridade, rótulo, prazo, e em \"Mais filtros\" tela e quem pediu, além da ordenação — sobre a lista inteira.\n * - **Coluna**: \"Mais antiga há 4h 12min\" (pelo `status_at`) e as vencidas abaixo do título, vazio explicado e\n * \"+ Criar tarefa\" no rodapé (os templates `hmKanbanColumnSummary`/`Empty`/`Footer` do `hm-kanban`).\n * - **Cartão**: capa (token da paleta), chave, selo de prioridade, título, contexto (tipo · tela), rótulos, trecho,\n * checklist (e os itens, com \"Mostrar no cartão\"), prazo por extenso (vencida em vermelho; hoje/amanhã em âmbar) e o\n * rodapé com comentários, checklist, apoios, a data e os responsáveis com \"+N\"; o \"⋮\": status e prioridade\n * (submenus), atribuir a mim, copiar link e chave, rótulos, capa (popover), arquivar e excluir (com confirmação).\n * - **Criar**: sempre o cadastro completo (a tarefa em branco no modal), já com o status da coluna: \"Nova tarefa\" no\n * topo (o \"▾\" escolhe a coluna), o \"+\" do cabeçalho e o \"+ Criar tarefa\" do rodapé de cada coluna.\n * - **Arrastar** (ponteiro, toque ou teclado; o `hm-kanban` cuida do gesto e dos anúncios) muda status e/ou posição: a\n * tela aplica na hora e grava; se o servidor recusar, avisa e relê. A posição gravada é sempre a da coluna INTEIRA\n * (pelo vizinho visível). Fora da \"ordem do quadro\", arrastar só troca de coluna (vai para o fim).\n * - **Arquivo**: arquivadas, recusadas, agrupadas (selo \"Agrupada\", com \"Desagrupar\") e concluídas antigas, paginado e\n * buscado no servidor, com \"Reabrir\"/\"Restaurar\".\n * - **Agrupar**: \"Agrupar em…\" no \"⋯\" do cartão e no detalhe abre o seletor (`spine-suggestion-merge-picker`) com as\n * abertas do quadro e a prévia do servidor; confirmar agrupa, tira a origem do quadro e abre o destino.\n * - **Tarefa**: `spine-suggestion-task-detail` (modal de duas colunas); o link \"?sugestao=SUG-12\" abre direto nela.\n */\n@Component({\n selector: 'spine-auto-service-suggestions',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, EmptyComponent, IconButtonComponent, IconComponent,\n KanbanCardDirective, KanbanColumnActionsDirective, KanbanColumnEmptyDirective, KanbanColumnFooterDirective,\n KanbanColumnSummaryDirective, KanbanComponent, MenuButtonComponent, PaginatorComponent,\n SearchFieldComponent, SegmentedControlComponent, SelectComponent, SpineTagRowComponent, SuggestionMergePickerComponent,\n SuggestionTaskDetailComponent, TagComponent,\n ],\n templateUrl: './auto-service-suggestions.component.html',\n styleUrl: './auto-service-suggestions.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceSuggestionsComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.suggestions;\n private readonly service = inject(AutoServiceSuggestionsService);\n private readonly toast = inject(HermesToastService);\n private readonly dialogs = inject(HermesDialogService);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly userStorage = inject(SpineUserStorage, { optional: true });\n private readonly router = inject(Router, { optional: true });\n private readonly location = inject(Location, { optional: true });\n /** O client da sessão: a tela da sugestão só abre daqui se o app administrado for este. */\n private readonly sessionClientId = inject(AUTH_CONFIG, { optional: true })?.clientId ?? null;\n\n readonly clientId = input.required<string>();\n\n protected readonly kinds = SPINE_SUGGESTION_KINDS;\n protected readonly statuses = SPINE_SUGGESTION_STATUSES;\n protected readonly statusColors = SPINE_SUGGESTION_STATUS_COLORS;\n protected readonly statusIcons = SPINE_SUGGESTION_STATUS_ICONS;\n protected readonly kindColors = SPINE_SUGGESTION_KIND_COLORS;\n protected readonly waitingValues = SPINE_SUGGESTION_WAITING;\n protected readonly waitingColors = SPINE_SUGGESTION_WAITING_COLORS;\n protected readonly newScreenValue = NEW_SCREEN_VALUE;\n protected readonly priorities = TASK_PRIORITIES;\n protected readonly sortKeys: readonly SortKey[] = ['position', 'votes', 'recent', 'priority', 'due'];\n protected readonly today = todayIso(this.preferences.effectiveTimeZone());\n\n protected readonly mode = signal<Mode>('board');\n protected readonly modeOptions: readonly SegmentedOption[] = [\n { value: 'board', label: this.text.viewBoard, icon: 'view-columns' },\n { value: 'archive', label: this.text.viewArchive, icon: 'archive' },\n ];\n\n // --- quadro ---\n protected readonly all = signal<AutoServiceTask[]>([]);\n protected readonly catalog = signal<TaskCatalogLabel[]>([]);\n protected readonly doneDays = signal(AUTO_SERVICE_SUGGESTION_DONE_DAYS);\n protected readonly loading = signal(false);\n protected readonly loadError = signal('');\n protected readonly search = signal('');\n protected readonly kind = signal<string>('');\n protected readonly screen = signal<string>('');\n protected readonly author = signal<string>('');\n /** '' | 'me' | 'none' | user_id */\n protected readonly assignee = signal<string>('');\n protected readonly label = signal<string>('');\n protected readonly priority = signal<string>('');\n /** '' | 'overdue' | 'soon' */\n protected readonly due = signal<string>('');\n /** '' | um status do quadro: só essa coluna aparece. */\n protected readonly status = signal<string>('');\n /** '' | 'solicitante' | 'responsaveis': com quem está a vez na conversa. */\n protected readonly waiting = signal<string>('');\n /** '' | 'none' (criada pela equipe, sem grupo) | group_id: o grupo de quem pediu. */\n protected readonly group = signal<string>('');\n protected readonly sort = signal<SortKey>('position');\n /** \"Mais filtros\" aberto (quem pediu e o grupo). */\n protected readonly moreFilters = signal(false);\n protected readonly boardStatuses = BOARD_STATUSES;\n /** Os filtros escondidos em \"Mais filtros\" que estão ligados (o botão mostra a conta). */\n protected readonly extraFilters = computed(() => [this.author(), this.group()].filter(Boolean).length);\n protected readonly moreFiltersText = computed(() => (this.extraFilters()\n ? formatMessage(this.text.moreFiltersActive, { count: this.extraFilters() }) : this.text.moreFilters));\n\n protected readonly me = computed(() => this.userStorage?.userId() ?? '');\n\n protected readonly filtered = computed(() => {\n const term = fold(this.search().trim());\n const keyMatch = this.search().trim().match(/^(?:sug-?)?(\\d{1,9})$/i);\n const [kind, screen, author, assignee, label, priority, due, waiting, group] = [this.kind(), this.screen(),\n this.author(), this.assignee(), this.label(), this.priority(), this.due(), this.waiting(), this.group()];\n const me = this.me();\n return this.all().filter((s) => (!kind || s.kind === kind)\n && (!screen || (screen === NEW_SCREEN_VALUE ? !!s.screen.new : !s.screen.new && s.screen.path === screen))\n && (!waiting || (s.waiting_on === waiting && OPEN_STATUSES.includes(s.status)))\n && (!group || (group === 'none' ? !s.groups?.length : !!s.groups?.some((g) => g.id === group)))\n && (!author || s.author?.user_id === author)\n && (!assignee || (assignee === 'none' ? s.assignees.length === 0 : assignedTo(s, assignee === 'me' ? me : assignee)))\n && (!label || s.labels.some((l) => l.id === label))\n && (!priority || s.priority === priority)\n && (!due || this.matchesDue(s, due))\n && (!term || (keyMatch && s.key_number === Number(keyMatch[1]))\n || fold(`${s.title} ${s.description} ${s.screen.label ?? ''} ${this.personName(s.author)} ${s.key}`).includes(term)));\n });\n protected readonly isFiltered = computed(() => !!(this.search().trim() || this.kind() || this.screen() || this.author()\n || this.assignee() || this.label() || this.priority() || this.due() || this.status() || this.waiting() || this.group()));\n protected readonly filteredText = computed(() => formatMessage(this.text.boardFiltered, {\n shown: this.columns().reduce((n, c) => n + c.items.length, 0), total: this.all().length,\n }));\n\n protected readonly columns = computed<KanbanColumn<AutoServiceTask>[]>(() => {\n const list = this.filtered();\n const order = SORTS[this.sort()];\n const only = this.status();\n return BOARD_STATUSES.filter((status) => !only || status === only).map((status) => ({\n id: status, title: this.text.statuses[status], items: list.filter((s) => s.status === status).sort(order),\n }));\n });\n\n /**\n * Resumo de cada coluna (o que está à vista nela): há quanto tempo a mais antiga está no status (\"Mais antiga há\n * 4h 12min\", pelo `status_at`) e quantas vencidas.\n */\n protected readonly columnSummaries = computed(() => {\n const now = Date.now();\n return new Map(this.columns().map((c) => {\n const since = c.items.map((s) => Date.parse(s.status_at ?? s.created_at)).filter((t) => !Number.isNaN(t));\n const oldest = since.length ? this.duration(now - Math.min(...since)) : '';\n const overdue = c.items.filter((s) => dueState(s, this.today) === 'overdue').length;\n return [c.id, {\n oldest: oldest ? formatMessage(this.text.columnOldest, { age: oldest }) : '',\n overdue: overdue ? pluralMessage(this.text.columnOverdue, overdue, this.messages.meta.locale) : '',\n }];\n }));\n });\n\n /**\n * Telas, pessoas, responsáveis e grupos que aparecem no quadro, para os filtros (só o que existe). As telas na ordem\n * do caminho (\"Módulo › Tela\"), então as de um módulo ficam juntas; as novas (que ainda não existem) são uma opção só.\n */\n protected readonly screens = computed(() => {\n const byPath = new Map<string, string>();\n for (const s of this.all()) if (s.screen.path && !s.screen.new) byPath.set(s.screen.path, s.screen.label || s.screen.path);\n return [...byPath].map(([path, label]) => ({ path, label })).sort((a, b) => a.label.localeCompare(b.label));\n });\n protected readonly hasNewScreens = computed(() => this.all().some((s) => s.screen.new));\n protected readonly groupOptions = computed(() => {\n const byId = new Map<string, string>();\n for (const s of this.all()) for (const g of s.groups ?? []) byId.set(g.id, g.name);\n return [...byId].map(([id, name]) => ({ id, name })).sort((a, b) => a.name.localeCompare(b.name));\n });\n protected readonly authors = computed(() => this.people((s) => (s.author ? [s.author] : [])));\n protected readonly assigneeOptions = computed(() => this.people((s) => s.assignees));\n\n /** Indicadores do quadro inteiro (o filtro não muda: é o retrato do app). */\n protected readonly stats = computed(() => {\n const list = this.all();\n const count = (status: SpineSuggestionStatus) => list.filter((s) => s.status === status).length;\n const open = list.filter((s) => OPEN_STATUSES.includes(s.status));\n const yesterday = addDays(this.today, -1);\n const zone = this.preferences.effectiveTimeZone();\n const overdue = open.filter((s) => dueState(s, this.today) === 'overdue');\n const done = list.filter((s) => s.status === 'concluida');\n return {\n open: open.length, em_analise: count('em_analise'), planejada: count('planejada'),\n em_desenvolvimento: count('em_desenvolvimento'), concluida: done.length,\n mine: open.filter((s) => assignedTo(s, this.me())).length,\n overdue: overdue.length,\n /** Venceram ontem: passaram a vencidas hoje (o \"+N desde ontem\"). */\n overdueNew: overdue.filter((s) => s.due_date === yesterday).length,\n soon: open.filter((s) => { const d = dueState(s, this.today); return d === 'today' || d === 'tomorrow'; }).length,\n /** A vez é da equipe (quem pediu escreveu) e as mensagens de quem pede ainda não lidas por quem consulta. */\n waitingTeam: open.filter((s) => s.waiting_on === 'responsaveis').length,\n unread: list.reduce((n, s) => n + (s.unread ?? 0), 0),\n doneToday: done.filter((s) => todayIso(zone, new Date(s.status_at ?? s.updated_at)) === this.today).length,\n byPriority: TASK_PRIORITIES.map((p) => ({ priority: p, count: open.filter((s) => s.priority === p).length })),\n };\n });\n protected readonly doneLabel = computed(() => formatMessage(this.text.kpiDone, { days: this.doneDays() }));\n /** \"Em análise 3 · Planejada 4 · Em desenvolvimento 5\" no indicador das abertas. */\n protected readonly openParts = computed(() => OPEN_STATUSES.map((st) => ({\n status: st,\n text: formatMessage(this.text.kpiStatusCount, { status: this.text.statuses[st], count: this.all().filter((s) => s.status === st).length }),\n })));\n protected readonly overdueNote = computed(() => (this.stats().overdueNew\n ? formatMessage(this.text.kpiOverdueTrend, { count: this.stats().overdueNew }) : this.text.kpiOverdueSteady));\n protected readonly doneNote = computed(() => (this.stats().doneToday\n ? formatMessage(this.text.kpiDoneToday, { count: this.stats().doneToday }) : this.text.kpiDoneNoneToday));\n protected readonly kpiLoading = computed(() => this.loading() && !this.all().length);\n /** Itens do \"▾\" ao lado de \"Nova tarefa\": criar direto numa coluna. */\n protected readonly newTaskItems: MenuItem[] = BOARD_STATUSES.map((st) => ({\n id: st, label: formatMessage(this.text.newTaskIn, { status: this.text.statuses[st] }), icon: SPINE_SUGGESTION_STATUS_ICONS[st],\n }));\n protected readonly topIds = computed(() => new Set(\n this.all().filter((s) => s.votes > 0).sort(SORTS.votes).slice(0, TOP_VOTED).map((s) => s.id)));\n\n /** O menu \"⋯\" de cada cartão, montado uma vez por versão da tarefa (o menu aberto não perde o foco). */\n protected readonly menus = computed(() => new Map(this.all().map((t) => [t.id, this.buildMenu(t)])));\n\n protected readonly itemKey = (s: AutoServiceTask) => s.id;\n protected readonly itemLabel = (s: AutoServiceTask) => `${s.key} ${s.title}`;\n\n // --- arquivo ---\n protected readonly archived = signal<AutoServiceTask[]>([]);\n protected readonly archiveTotal = signal(0);\n protected readonly archivePage = signal<PaginationState>({ page: 1, size: ARCHIVE_PAGE });\n protected readonly archiveSearch = signal('');\n protected readonly archiveKind = signal<string>('');\n protected readonly archiveStatus = signal<string>('');\n protected readonly archiveLoading = signal(false);\n protected readonly archiveError = signal('');\n protected readonly reopening = signal<string | null>(null);\n protected readonly archiveCountText = computed(() =>\n pluralMessage(this.text.archiveCount, this.archiveTotal(), this.messages.meta.locale));\n protected readonly archiveEmptyHint = computed(() => formatMessage(this.text.archiveEmptyHint, { days: this.doneDays() }));\n\n // --- tarefa aberta ---\n protected readonly selected = signal<AutoServiceTask | null>(null);\n protected readonly drafting = signal(false);\n protected readonly draftStatus = signal<SpineSuggestionStatus>('em_analise');\n protected readonly canOpenScreen = computed(() =>\n !!this.sessionClientId && this.sessionClientId.toLowerCase() === this.clientId().toLowerCase());\n\n private linkHandled = false;\n\n constructor() {\n effect(() => {\n const clientId = this.clientId();\n untracked(() => {\n this.selected.set(null);\n this.drafting.set(false);\n void this.loadLabels(clientId);\n if (this.mode() === 'archive') void this.loadArchive(1, clientId);\n else void this.load(clientId);\n });\n });\n }\n\n private people(of: (s: AutoServiceTask) => readonly SpineSuggestionPerson[]): SpineSuggestionPerson[] {\n const byId = new Map<string, SpineSuggestionPerson>();\n for (const s of this.all()) for (const p of of(s)) byId.set(p.user_id, p);\n return [...byId.values()].sort((a, b) => this.personName(a).localeCompare(this.personName(b)));\n }\n\n private matchesDue(s: AutoServiceTask, due: string): boolean {\n const state = dueState(s, this.today);\n return due === 'overdue' ? state === 'overdue' : state === 'today' || state === 'tomorrow';\n }\n\n protected setMode(value: string): void {\n const mode = value === 'archive' ? 'archive' : 'board';\n if (mode === this.mode()) return;\n this.mode.set(mode);\n // Cada troca relê: o que foi reaberto no arquivo aparece no quadro e vice-versa.\n if (mode === 'archive') void this.loadArchive(1);\n else void this.load();\n }\n\n protected refresh(): void {\n if (this.mode() === 'archive') void this.loadArchive(this.archivePage().page);\n else void this.load();\n }\n\n protected async load(clientId = this.clientId()): Promise<void> {\n this.loading.set(true);\n this.loadError.set('');\n try {\n const board = await this.service.board(clientId);\n this.all.set(board.suggestions);\n this.doneDays.set(board.doneDays);\n void this.openFromLink(clientId);\n } catch {\n this.loadError.set(this.text.loadError);\n } finally {\n this.loading.set(false);\n }\n }\n\n private async loadLabels(clientId = this.clientId()): Promise<void> {\n try {\n this.catalog.set(await this.service.labels(clientId));\n } catch {\n this.catalog.set([]);\n }\n }\n\n /** \"?sugestao=SUG-12\" na URL: abre a tarefa (uma vez por tela). */\n private async openFromLink(clientId: string): Promise<void> {\n if (this.linkHandled || !this.router) return;\n this.linkHandled = true;\n const key = this.router.parseUrl(this.router.url).queryParams[SUGGESTION_LINK_PARAM];\n if (typeof key !== 'string' || !key) return;\n const known = this.all().find((s) => s.key.toLowerCase() === key.toLowerCase());\n try {\n this.openDetail(known ?? (await this.service.lookup(clientId, key)));\n } catch {\n this.toast.error(this.text.loadError);\n }\n }\n\n protected clearFilters(): void {\n for (const s of [this.search, this.kind, this.screen, this.author, this.assignee, this.label, this.priority, this.due, this.status,\n this.waiting, this.group]) {\n s.set('');\n }\n }\n\n /**\n * Indicador que filtra (\"atribuídas a mim\", \"vencidas\", \"vencendo em breve\", \"aguardando responsáveis\"): liga/desliga\n * o filtro equivalente.\n */\n protected toggleKpi(which: 'mine' | 'overdue' | 'soon' | 'waiting', on: boolean): void {\n if (which === 'mine') this.assignee.set(on ? 'me' : '');\n else if (which === 'waiting') this.waiting.set(on ? 'responsaveis' : '');\n else this.due.set(on ? which : '');\n }\n\n /** Uma prioridade da legenda do indicador: filtra por ela (de novo, desliga). */\n protected togglePriority(p: TaskPriority): void {\n this.priority.update((current) => (current === p ? '' : p));\n }\n\n /** Largura de cada prioridade na barra empilhada (% das abertas). */\n protected priorityShare(count: number): number {\n const total = this.stats().open;\n return total ? (count / total) * 100 : 0;\n }\n\n protected priorityPart(p: TaskPriority, count: number): string {\n return formatMessage(this.text.kpiPriorityPart, { priority: this.text.priorities[p], count });\n }\n\n /**\n * O quadro já moveu o cartão (na lista filtrada); aqui vira a posição na coluna INTEIRA — logo depois do vizinho de\n * cima que está visível (ou antes do de baixo; sozinho na coluna filtrada = fim) — aplica na lista e grava. Com\n * outra ordenação, só a coluna conta: vai para o fim dela, e reordenar na mesma coluna não grava.\n */\n protected async onMoved(event: KanbanMoveEvent<AutoServiceTask>): Promise<void> {\n const item = event.item;\n const to = event.to as SpineSuggestionStatus;\n const changed = event.from !== to;\n let change: { status?: SpineSuggestionStatus; position?: number };\n\n if (this.sort() !== 'position') {\n if (!changed) {\n this.all.update((list) => [...list]); // devolve o cartão ao lugar da ordenação\n return;\n }\n const end = this.all().filter((s) => s.status === to && s.id !== item.id).length;\n this.all.update((list) => list.map((s) => (s.id === item.id ? { ...s, status: to, position: end } : s)));\n change = { status: to };\n } else {\n const shown = event.columns.find((c) => c.id === to)?.items ?? [];\n const above = shown[event.toIndex - 1];\n const below = shown[event.toIndex + 1];\n const column = this.all().filter((s) => s.status === to && s.id !== item.id).sort(byPosition);\n let index = column.length;\n if (above) index = column.findIndex((s) => s.id === above.id) + 1;\n else if (below) index = Math.max(0, column.findIndex((s) => s.id === below.id));\n\n const order = [...column.slice(0, index).map((s) => s.id), item.id, ...column.slice(index).map((s) => s.id)];\n const position = new Map(order.map((id, i) => [id, i]));\n this.all.update((list) => list.map((s) => (position.has(s.id)\n ? { ...s, position: position.get(s.id)!, ...(s.id === item.id ? { status: to } : {}) } : s)));\n change = { ...(changed ? { status: to } : {}), position: index };\n }\n\n try {\n this.replace(await this.service.move(this.clientId(), item.id, change));\n } catch {\n this.toast.error(this.text.moveError);\n await this.load();\n }\n }\n\n // --- criação ---\n\n /**\n * Abre o cadastro completo (a tarefa em branco no modal) já na coluna escolhida: \"Nova tarefa\" do topo (Em análise),\n * o \"▾\" ao lado dele, o \"+\" do cabeçalho e o \"+ Criar tarefa\" do rodapé de cada coluna.\n */\n protected newTask(status: string = 'em_analise'): void {\n this.selected.set(null);\n this.draftStatus.set(BOARD_STATUSES.includes(status as (typeof BOARD_STATUSES)[number]) ? (status as SpineSuggestionStatus) : 'em_analise');\n this.drafting.set(true);\n }\n\n /** Nome do \"+\" da coluna: \"Nova tarefa em Planejada\". */\n protected newTaskInLabel(status: string): string {\n return formatMessage(this.text.newTaskIn, { status: this.text.statuses[status as SpineSuggestionStatus] ?? status });\n }\n\n // --- tarefa aberta ---\n\n protected openDetail(s: AutoServiceTask): void {\n this.drafting.set(false);\n this.selected.set(s);\n }\n\n protected closeDetail(): void {\n this.selected.set(null);\n this.drafting.set(false);\n if (this.mode() === 'archive') void this.loadArchive(this.archivePage().page);\n }\n\n protected onCreated(task: AutoServiceTask): void {\n if (this.mode() === 'board') this.all.update((list) => [...list, task]);\n this.drafting.set(false);\n this.selected.set(task);\n }\n\n protected onRemoved(task: AutoServiceTask): void {\n this.all.update((list) => list.filter((s) => s.id !== task.id));\n this.archived.update((list) => list.filter((s) => s.id !== task.id));\n this.archiveTotal.update((n) => Math.max(0, n - (this.mode() === 'archive' ? 1 : 0)));\n this.selected.set(null);\n }\n\n protected onLabelCreated(label: TaskCatalogLabel): void {\n this.catalog.update((list) => [...list, label].sort((a, b) => a.name.localeCompare(b.name)));\n }\n\n /**\n * Troca a tarefa nas listas (o que o servidor devolveu), mantendo o autor que já veio com a foto. Recusada,\n * arquivada e agrupada saem do quadro na hora (o servidor também as tira do próximo `board=true`).\n */\n protected replace(saved: AutoServiceTask): void {\n const merge = (s: AutoServiceTask) => ({ ...s, ...saved, author: saved.author ?? s.author });\n const leaves = saved.status === 'recusada' || !!saved.archived_at || !!saved.merged_into;\n this.all.update((list) => (leaves\n ? list.filter((s) => s.id !== saved.id)\n : list.map((s) => (s.id === saved.id ? merge(s) : s))));\n this.archived.update((list) => list.map((s) => (s.id === saved.id ? merge(s) : s)));\n }\n\n // --- menu do cartão ---\n\n private buildMenu(t: AutoServiceTask): MenuItem[] {\n const linked = new Set(t.labels.map((l) => l.id));\n const labels: MenuItem[] = this.catalog().length\n ? this.catalog().map((l) => ({ id: `label:${l.id}`, label: l.name, icon: linked.has(l.id) ? 'check' : 'tag' }))\n : [{ id: 'label:none', label: this.text.menuNoLabels, disabled: true }];\n return [\n {\n id: 'status', label: this.text.menuStatus, icon: 'view-columns',\n children: SPINE_SUGGESTION_STATUSES.map((st) => ({\n id: `status:${st}`, label: this.text.statuses[st], icon: st === t.status ? 'check' : SPINE_SUGGESTION_STATUS_ICONS[st], disabled: st === t.status,\n })),\n },\n {\n id: 'priority', label: this.text.menuPriority, icon: TASK_PRIORITY_ICONS[t.priority],\n children: TASK_PRIORITIES.map((p) => ({ id: `priority:${p}`, label: this.text.priorities[p], icon: p === t.priority ? 'check' : TASK_PRIORITY_ICONS[p] })),\n },\n {\n id: 'waiting', label: this.text.menuWaiting, icon: 'chat-bubble',\n children: [\n ...SPINE_SUGGESTION_WAITING.map((w) => ({\n id: `waiting:${w}`, label: this.text.waiting[w], icon: t.waiting_on === w ? 'check' : 'chat-bubble', disabled: t.waiting_on === w,\n })),\n { id: 'waiting:none', label: this.text.waitingClear, icon: t.waiting_on ? 'check-circle' : 'check', disabled: !t.waiting_on },\n ],\n },\n { id: 'assign-me', label: this.text.menuAssignMe, icon: 'user-plus', disabled: assignedTo(t, this.me()) },\n { id: 'labels', label: this.text.menuLabel, icon: 'tag', children: labels },\n { id: 'copy-link', label: this.text.menuCopyLink, icon: 'link', separatorAbove: true },\n { id: 'copy-key', label: this.text.menuCopyKey, icon: 'copy' },\n // Sem cadeia: a que já recebeu outras não pode ser agrupada (o seletor explica; aqui fica desligado).\n { id: 'merge', label: this.text.menuMerge, icon: 'layers', separatorAbove: true, disabled: !!t.merged_count },\n { id: 'archive', label: this.text.menuArchive, icon: 'archive', separatorAbove: true },\n { id: 'delete', label: this.text.menuDelete, icon: 'trash', danger: true },\n ];\n }\n\n protected menuOf(t: AutoServiceTask): MenuItem[] {\n return this.menus().get(t.id) ?? [];\n }\n\n protected menuLabel(t: AutoServiceTask): string {\n return formatMessage(this.text.cardMenu, { key: t.key });\n }\n\n /** Uma escolha do \"⋯\": cada uma grava e devolve a tarefa nova (ou copia, ou abre a capa ancorada no botão). */\n protected async onMenu(t: AutoServiceTask, id: string, anchor: HTMLElement): Promise<void> {\n const clientId = this.clientId();\n const [action, value] = id.split(':');\n try {\n if (action === 'status') this.replace(await this.service.move(clientId, t.id, { status: value as SpineSuggestionStatus }));\n else if (action === 'priority') this.replace(await this.service.update(clientId, t.id, { priority: value as TaskPriority }));\n else if (action === 'waiting') {\n this.replace(await this.service.update(clientId, t.id, { waiting_on: value === 'none' ? null : value as SpineSuggestionWaiting }));\n this.toast.success(this.text.waitingSaved);\n }\n else if (action === 'assign-me') {\n this.replace(await this.service.addPerson(clientId, t.id, 'me', 'responsavel'));\n this.toast.success(this.text.assignedToMe);\n } else if (action === 'label') {\n this.replace(await this.service.setLabel(clientId, t.id, value, !t.labels.some((l) => l.id === value)));\n } else if (action === 'copy-link') {\n if (await copyText(this.linkOf(t))) this.toast.success(this.text.linkCopied);\n else this.toast.error(this.text.copyError);\n } else if (action === 'copy-key') {\n if (await copyText(t.key)) this.toast.success(this.text.keyCopied);\n else this.toast.error(this.text.copyError);\n } else if (action === 'merge') {\n this.startMerge(t);\n } else if (action === 'archive') {\n this.replace(await this.service.setArchived(clientId, t.id, true));\n this.toast.success(this.text.archivedToast);\n } else if (action === 'delete') await this.confirmDelete(t);\n } catch {\n this.toast.error(this.text.saveError);\n }\n }\n\n // --- agrupar ---\n\n /** A que está sendo agrupada (o seletor aberto); o detalhe fecha antes (um modal por vez). */\n protected readonly mergeSource = signal<AutoServiceTask | null>(null);\n\n protected startMerge(t: AutoServiceTask): void {\n this.selected.set(null);\n this.drafting.set(false);\n this.mergeSource.set(t);\n }\n\n /** Agrupou: a origem sai do quadro, o destino é trocado pela versão do servidor e abre (mostra \"Agrupadas aqui\"). */\n protected onMerged(event: { source: AutoServiceTask; target: AutoServiceTask }): void {\n this.mergeSource.set(null);\n this.all.update((list) => list.filter((s) => s.id !== event.source.id));\n this.replace(event.target);\n this.selected.set(event.target);\n }\n\n /** O detalhe pediu outra tarefa (o destino de uma agrupada, uma das agrupadas): abre a completa. */\n protected async openTask(id: string): Promise<void> {\n try {\n const task = await this.service.task(this.clientId(), id);\n this.openDetail(task);\n } catch {\n this.toast.error(this.text.loadError);\n }\n }\n\n /** Desagrupou: a origem volta ao quadro (relê o que estiver à vista). */\n protected onUnmerged(): void {\n if (this.mode() === 'archive') void this.loadArchive(this.archivePage().page);\n else void this.load();\n }\n\n protected mergedIntoText(key: string): string {\n return formatMessage(this.text.mergedInto, { key });\n }\n\n /** \"Desagrupar\" no arquivo. */\n protected async unmergeFromArchive(t: AutoServiceTask): Promise<void> {\n this.reopening.set(t.id);\n try {\n await this.service.unmerge(this.clientId(), t.id);\n this.toast.success(formatMessage(this.text.unmergedToast, { key: t.key }));\n void this.loadArchive(this.archivePage().page);\n } catch {\n this.toast.error(this.text.saveError);\n } finally {\n this.reopening.set(null);\n }\n }\n\n private async confirmDelete(t: AutoServiceTask): Promise<void> {\n const ok = await this.dialogs.confirm({\n heading: formatMessage(this.text.deleteHeading, { key: t.key }), message: this.text.deleteMessage,\n confirmLabel: this.text.deleteConfirm, danger: true,\n });\n if (!ok) return;\n await this.service.remove(this.clientId(), t.id);\n this.onRemoved(t);\n this.toast.success(this.text.deleted);\n }\n\n /** O link da tela com a tarefa: o caminho atual (sem a query) + \"?sugestao=SUG-12\". */\n private linkOf(t: AutoServiceTask): string {\n const path = (this.location?.path() ?? '').split('?')[0];\n const base = this.location?.prepareExternalUrl(path) ?? path;\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n return `${origin}${base}?${SUGGESTION_LINK_PARAM}=${encodeURIComponent(t.key)}`;\n }\n\n /** Item do checklist marcado no próprio cartão. */\n protected async toggleCardItem(t: AutoServiceTask, item: TaskChecklistItem): Promise<void> {\n try {\n this.replace(await this.service.updateChecklistItem(this.clientId(), t.id, item.id, { done: !item.done }));\n } catch {\n this.toast.error(this.text.saveError);\n }\n }\n\n // --- arquivo ---\n\n protected async loadArchive(page = 1, clientId = this.clientId()): Promise<void> {\n const size = this.archivePage().size;\n this.archiveLoading.set(true);\n this.archiveError.set('');\n try {\n const res = await this.service.archive(clientId, {\n limit: size, offset: (page - 1) * size, search: this.archiveSearch().trim(),\n kind: this.archiveKind() as AutoServiceTask['kind'] | '', status: this.archiveStatus() as 'concluida' | 'recusada' | '',\n });\n this.archived.set(res.suggestions);\n this.archiveTotal.set(res.total);\n this.archivePage.set({ page, size });\n } catch {\n this.archiveError.set(this.text.loadError);\n } finally {\n this.archiveLoading.set(false);\n }\n }\n\n protected onArchiveSearch(term: string): void {\n this.archiveSearch.set(term);\n void this.loadArchive(1);\n }\n\n protected onArchiveFilter(which: 'kind' | 'status', value: string): void {\n (which === 'kind' ? this.archiveKind : this.archiveStatus).set(value);\n void this.loadArchive(1);\n }\n\n protected onArchivePage(state: PaginationState): void {\n this.archivePage.set({ page: state.page, size: state.size });\n void this.loadArchive(state.page);\n }\n\n /** Recusada volta para Em análise (fim da coluna); arquivada volta ao quadro com o status que tinha. */\n protected async reopen(s: AutoServiceTask): Promise<void> {\n if (this.reopening()) return;\n this.reopening.set(s.id);\n try {\n if (s.archived_at) await this.service.setArchived(this.clientId(), s.id, false);\n if (s.status === 'recusada') await this.service.move(this.clientId(), s.id, { status: 'em_analise' });\n this.toast.success(s.status === 'recusada' ? this.text.reopened : this.text.restoredToast);\n const page = this.archivePage().page;\n // Última da página: volta uma, para não cair numa página vazia.\n await this.loadArchive(this.archived().length === 1 && page > 1 ? page - 1 : page);\n } catch {\n this.toast.error(this.text.reopenError);\n } finally {\n this.reopening.set(null);\n }\n }\n\n // --- textos do cartão ---\n\n protected sortLabel(k: SortKey): string {\n if (k === 'priority') return this.text.priority;\n if (k === 'due') return this.text.dueDate;\n return this.text.sorts[k];\n }\n\n protected kindLabel(s: AutoServiceTask): string {\n return this.text.kinds[s.kind];\n }\n\n protected kindIcon(s: AutoServiceTask): string {\n return SPINE_SUGGESTION_KIND_ICONS[s.kind];\n }\n\n protected priorityIcon(s: AutoServiceTask): string {\n return TASK_PRIORITY_ICONS[s.priority];\n }\n\n protected priorityName(s: AutoServiceTask): string {\n return this.text.priorities[s.priority];\n }\n\n protected isTop(s: AutoServiceTask): boolean {\n return this.topIds().has(s.id);\n }\n\n protected excerpt(s: AutoServiceTask): string {\n const d = s.description.replace(/\\s+/g, ' ').trim();\n return d.length > EXCERPT ? `${d.slice(0, EXCERPT - 1).trimEnd()}…` : d;\n }\n\n protected faces(s: AutoServiceTask): SpineSuggestionPerson[] {\n return s.assignees.slice(0, FACES);\n }\n\n protected moreFaces(s: AutoServiceTask): string {\n const rest = s.assignees.length - FACES;\n return rest > 0 ? formatMessage(this.text.moreAssignees, { count: rest }) : '';\n }\n\n protected dueOf(s: AutoServiceTask): DueState {\n return dueState(s, this.today);\n }\n\n /** \"Vencida há 3 dias\", \"Vence hoje\", \"Vence amanhã\", \"No prazo · até 12 de nov.\" (concluída: \"Até 12 de nov.\"). */\n protected dueText(s: AutoServiceTask): string {\n if (!s.due_date) return '';\n const state = this.dueOf(s);\n if (state === 'overdue') {\n return pluralMessage(this.text.dueLateDays, daysBetween(s.due_date, this.today), this.messages.meta.locale);\n }\n if (state === 'today') return this.text.dueToday;\n if (state === 'tomorrow') return this.text.dueTomorrow;\n if (state === 'later') return formatMessage(this.text.dueWithin, { date: this.day(s.due_date) });\n return formatMessage(this.text.dueOn, { date: this.day(s.due_date) });\n }\n\n protected dueIcon(s: AutoServiceTask): string {\n const state = this.dueOf(s);\n if (state === 'overdue') return 'alarm-clock';\n if (state === 'today' || state === 'tomorrow') return 'hourglass';\n return 'calendar';\n }\n\n /** O nome da tela no cartão: o último nível do caminho, o nome da nova ou \"Sem tela\". */\n protected screenNameOf(s: AutoServiceTask): string {\n if (s.screen.new) return s.screen.label || this.text.newScreenTag;\n return screenName(s.screen.label) || s.screen.path || this.text.noScreen;\n }\n\n /** Selo \"Aguardando…\" do cartão (o `let-item` do kanban chega sem tipo). */\n protected waitingName(s: AutoServiceTask): string {\n return s.waiting_on ? this.text.waiting[s.waiting_on] : '';\n }\n\n protected waitingColor(s: AutoServiceTask) {\n return s.waiting_on ? SPINE_SUGGESTION_WAITING_COLORS[s.waiting_on] : 'neutral';\n }\n\n protected unreadText(count: number): string {\n return pluralMessage(this.text.unread, count, this.messages.meta.locale);\n }\n\n protected createdText(s: AutoServiceTask): string {\n return formatMessage(this.text.createdOn, { date: this.date(s.created_at, true) });\n }\n\n /** Explicação da coluna vazia: com filtro, \"nenhuma com estes filtros\"; sem, o que costuma cair nela. */\n protected emptyHint(status: string): string {\n if (this.isFiltered()) return this.text.columnEmptyFiltered;\n const hint = this.text.columnEmptyHints[status as (typeof BOARD_STATUSES)[number]] ?? '';\n return formatMessage(hint, { days: this.doneDays() });\n }\n\n protected emptyIcon(status: string): string {\n return this.isFiltered() ? 'filter' : (SPINE_SUGGESTION_STATUS_ICONS[status as SpineSuggestionStatus] ?? 'inbox');\n }\n\n /** \"3d 4h\", \"4h 12min\", \"12min\" (o catálogo dá o formato). */\n private duration(ms: number): string {\n const { d, h, m } = splitDuration(ms);\n if (d) return formatMessage(this.text.duration.days, { d, h });\n if (h) return formatMessage(this.text.duration.hours, { h, m });\n return formatMessage(this.text.duration.minutes, { m });\n }\n\n protected checklistText(s: AutoServiceTask): string {\n return formatMessage(this.text.checklistSpoken, { done: s.checklist.done, total: s.checklist.total });\n }\n\n /** Checklist no cartão: os itens abertos (por cartão, só nesta tela; começa fechado, o rodapé diz quantos faltam). */\n private readonly openChecklists = signal<ReadonlySet<string>>(new Set());\n\n protected checklistOpen(s: AutoServiceTask): boolean {\n return this.openChecklists().has(s.id);\n }\n\n protected toggleChecklist(s: AutoServiceTask): void {\n this.openChecklists.update((set) => {\n const next = new Set(set);\n if (!next.delete(s.id)) next.add(s.id);\n return next;\n });\n }\n\n /** Os rótulos na linha de selos do cartão, cada um com a cor do token ('cat-3' → 3). */\n protected labelTags(s: AutoServiceTask): SpineTagRowItem[] {\n return s.labels.map((l) => ({ id: l.id, name: l.name, color: Number(l.color.replace('cat-', '')) || undefined }));\n }\n\n /** \"3 atividades (1/3)\". */\n protected cardChecklistText(s: AutoServiceTask): string {\n return pluralMessage(this.text.cardChecklist, s.checklist.total, this.messages.meta.locale, { done: s.checklist.done });\n }\n\n /** \"Pedida por Ana\" (+N relatores das agrupadas): a dica da foto de quem pediu. */\n protected requestersText(s: AutoServiceTask): string {\n const who = formatMessage(this.text.requestedByName, { name: this.personName(s.author) });\n return s.reporters_count ? `${who} ${this.moreText(s.reporters_count)}` : who;\n }\n\n /** \"+N\". */\n protected moreText(count: number): string {\n return formatMessage(this.text.moreAssignees, { count });\n }\n\n protected cardItems(s: AutoServiceTask): TaskChecklistItem[] {\n return s.checklist_on_card ? [...(s.checklist.items ?? [])].sort((a, b) => a.position - b.position) : [];\n }\n\n protected personName(p: SpineSuggestionPerson | null | undefined): string {\n return p?.name || p?.username || this.text.removedAuthor;\n }\n\n protected votesText(count: number): string {\n return pluralMessage(this.text.votes, count, this.messages.meta.locale);\n }\n\n protected commentsText(count: number): string {\n return pluralMessage(this.text.comments, count, this.messages.meta.locale);\n }\n\n protected closedOn(s: AutoServiceTask): string {\n if (s.archived_at) return `${this.text.archivedTag} · ${this.date(s.archived_at)}`;\n const template = s.status === 'recusada' ? this.text.closedOn.recusada : this.text.closedOn.concluida;\n return formatMessage(template, { date: this.date(s.status_at ?? s.updated_at) });\n }\n\n /** \"há 3 dias\", \"ontem\", \"há 2 horas\" (Intl.RelativeTimeFormat no idioma do catálogo). */\n protected age(iso: string): string {\n const seconds = Math.round((Date.now() - new Date(iso).getTime()) / 1000);\n try {\n const rtf = new Intl.RelativeTimeFormat(this.messages.meta.locale, { numeric: 'auto' });\n for (const [unit, size] of AGES) if (Math.abs(seconds) >= size) return rtf.format(-Math.floor(seconds / size), unit);\n return rtf.format(0, 'minute');\n } catch {\n return this.date(iso);\n }\n }\n\n protected date(iso: string, withTime = false): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, {\n dateStyle: 'short', ...(withTime ? { timeStyle: 'short' as const } : {}), timeZone: this.preferences.effectiveTimeZone(),\n }).format(new Date(iso));\n } catch {\n return iso.slice(0, 10);\n }\n }\n\n /** Data sem hora (AAAA-MM-DD): o dia é o dia, sem fuso. */\n protected day(iso: string): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, { day: '2-digit', month: 'short', timeZone: 'UTC' }).format(new Date(`${iso}T00:00:00Z`));\n } catch {\n return iso;\n }\n }\n}\n","<div class=\"as-stack as-suggestions\">\n <!-- Quadro x Arquivo, o atualizar e a nova tarefa (com o \"▾\" para criar direto numa coluna). -->\n <div class=\"as-suggestions__bar\">\n <hm-segmented-control [label]=\"text.viewLabel\" [options]=\"modeOptions\" [value]=\"mode()\" (valueChange)=\"setMode($event)\" />\n <span class=\"as-suggestions__spacer\"></span>\n <hm-icon-button emphasis=\"subtle\" icon=\"refresh\" [label]=\"text.refresh\" (clicked)=\"refresh()\" />\n <span class=\"as-split\" role=\"group\" [attr.aria-label]=\"text.newTask\">\n <hm-button icon=\"plus\" (clicked)=\"newTask()\">{{ text.newTask }}</hm-button>\n <hm-menu-button class=\"as-split__more\" icon=\"chevron-down\" [showArrow]=\"false\" align=\"end\" [label]=\"text.newTaskOptions\"\n [items]=\"newTaskItems\" (chosen)=\"newTask($any($event))\" />\n </span>\n </div>\n\n @if (mode() === 'board') {\n @if (loadError()) {\n <hm-alert variant=\"error\">{{ loadError() }}</hm-alert>\n } @else {\n <!-- Indicadores do quadro inteiro (o filtro não mexe neles). Os botões filtram: vencidas, vencendo em breve,\n atribuídas a mim e cada prioridade da legenda. Cor sempre com texto junto. -->\n <section class=\"as-kpis\" [attr.aria-label]=\"text.kpis\" [attr.aria-busy]=\"kpiLoading() ? 'true' : null\">\n <button type=\"button\" class=\"as-kpi\" data-tone=\"danger\" [attr.aria-pressed]=\"due() === 'overdue'\"\n (click)=\"toggleKpi('overdue', due() !== 'overdue')\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"alarm-clock\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiOverdue }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().overdue }}</span>\n <span class=\"as-kpi__note\" [class.as-kpi__note--up]=\"stats().overdueNew > 0\">\n @if (stats().overdueNew) { <hm-icon shape=\"arrow-up\" /> }{{ overdueNote() }}\n </span>\n </span>\n </button>\n\n <button type=\"button\" class=\"as-kpi\" data-tone=\"warning\" [attr.aria-pressed]=\"due() === 'soon'\"\n (click)=\"toggleKpi('soon', due() !== 'soon')\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"hourglass\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiSoon }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().soon }}</span>\n <span class=\"as-kpi__note\">{{ text.dueSoonFilter }}</span>\n </span>\n </button>\n\n <!-- A vez é da equipe: quem pediu escreveu na conversa. A nota conta as mensagens ainda não lidas. -->\n <button type=\"button\" class=\"as-kpi\" data-tone=\"accent\" [attr.aria-pressed]=\"waiting() === 'responsaveis'\"\n (click)=\"toggleKpi('waiting', waiting() !== 'responsaveis')\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"chat-bubble\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.waiting.responsaveis }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().waitingTeam }}</span>\n <span class=\"as-kpi__note\" [class.as-kpi__note--up]=\"stats().unread > 0\">{{ unreadText(stats().unread) }}</span>\n </span>\n </button>\n\n <div class=\"as-kpi\" data-tone=\"info\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon [shape]=\"statusIcons.em_desenvolvimento\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiOpen }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().open }}</span>\n <span class=\"as-kpi__parts\">\n @for (part of openParts(); track part.status) {\n <span class=\"as-kpi__part\" [attr.data-status]=\"part.status\"><span class=\"as-kpi__dot\" aria-hidden=\"true\"></span>{{ part.text }}</span>\n }\n </span>\n </span>\n </div>\n\n <div class=\"as-kpi\" data-tone=\"success\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon [shape]=\"statusIcons.concluida\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ doneLabel() }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().concluida }}</span>\n <span class=\"as-kpi__note\" [class.as-kpi__note--good]=\"stats().doneToday > 0\">\n @if (stats().doneToday) { <hm-icon shape=\"arrow-up\" /> }{{ doneNote() }}\n </span>\n </span>\n </div>\n\n <button type=\"button\" class=\"as-kpi\" data-tone=\"accent\" [attr.aria-pressed]=\"assignee() === 'me'\"\n (click)=\"toggleKpi('mine', assignee() !== 'me')\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"user-checkmark\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiMine }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().mine }}</span>\n <span class=\"as-kpi__note\">{{ text.kpiMineHint }}</span>\n </span>\n </button>\n\n <div class=\"as-kpi as-kpi--wide\" data-tone=\"neutral\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"bar-chart\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiPriority }}</span>\n @if (stats().open) {\n <span class=\"as-kpi__bar\" aria-hidden=\"true\">\n @for (p of stats().byPriority; track p.priority) {\n @if (p.count) {\n <span class=\"as-kpi__seg\" [attr.data-priority]=\"p.priority\" [style.inline-size.%]=\"priorityShare(p.count)\"></span>\n }\n }\n </span>\n <span class=\"as-kpi__legend\">\n @for (p of stats().byPriority; track p.priority) {\n <button type=\"button\" class=\"as-kpi__chip\" [attr.data-priority]=\"p.priority\" [attr.aria-pressed]=\"priority() === p.priority\"\n [disabled]=\"!p.count && priority() !== p.priority\" (click)=\"togglePriority(p.priority)\">\n <span class=\"as-kpi__dot\" aria-hidden=\"true\"></span>{{ priorityPart(p.priority, p.count) }}\n </button>\n }\n </span>\n } @else {\n <span class=\"as-kpi__note\">{{ text.kpiPriorityNone }}</span>\n }\n </span>\n </div>\n </section>\n\n <!-- Filtros numa linha: busca larga, os mais usados e \"Mais filtros\" (tela, quem pediu); à direita, a ordenação.\n Valem sobre a lista inteira: a posição gravada ao arrastar é sempre a da coluna inteira. -->\n <div class=\"as-filters\" role=\"group\" [attr.aria-label]=\"text.filters\">\n <hm-search-field class=\"as-filters__search\" [label]=\"text.search\" labelHidden [placeholder]=\"text.search\"\n [landmark]=\"false\" [debounce]=\"150\" [value]=\"search()\" (search)=\"search.set($event)\" />\n <hm-select class=\"as-filters__select\" [label]=\"text.assigneeFilter\" labelHidden [(value)]=\"assignee\">\n <option value=\"\">{{ text.allAssignees }}</option>\n <option value=\"me\">{{ text.assigneeMine }}</option>\n <option value=\"none\">{{ text.assigneeNone }}</option>\n @for (p of assigneeOptions(); track p.user_id) {\n <option [value]=\"p.user_id\">{{ personName(p) }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.kindFilter\" labelHidden [(value)]=\"kind\">\n <option value=\"\">{{ text.allKinds }}</option>\n @for (k of kinds; track k) {\n <option [value]=\"k\">{{ text.kinds[k] }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.statusFilter\" labelHidden [(value)]=\"status\">\n <option value=\"\">{{ text.allBoardStatuses }}</option>\n @for (st of boardStatuses; track st) {\n <option [value]=\"st\">{{ text.statuses[st] }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.priorityFilter\" labelHidden [(value)]=\"priority\">\n <option value=\"\">{{ text.allPriorities }}</option>\n @for (p of priorities; track p) {\n <option [value]=\"p\">{{ text.priorities[p] }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.labelFilter\" labelHidden [(value)]=\"label\">\n <option value=\"\">{{ text.allLabels }}</option>\n @for (l of catalog(); track l.id) {\n <option [value]=\"l.id\">{{ l.name }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.dueFilter\" labelHidden [(value)]=\"due\">\n <option value=\"\">{{ text.dueAny }}</option>\n <option value=\"overdue\">{{ text.dueOverdueFilter }}</option>\n <option value=\"soon\">{{ text.dueSoonFilter }}</option>\n </hm-select>\n <!-- A tela a mudar: \"Módulo › Tela\" (as de um módulo ficam juntas) e as novas, que ainda não existem. -->\n <hm-select class=\"as-filters__select as-filters__select--wide\" [label]=\"text.screenFilter\" labelHidden [(value)]=\"screen\">\n <option value=\"\">{{ text.allScreens }}</option>\n @if (hasNewScreens()) {\n <option [value]=\"newScreenValue\">{{ text.newScreenTag }}</option>\n }\n @for (sc of screens(); track sc.path) {\n <option [value]=\"sc.path\">{{ sc.label }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.waitingFilter\" labelHidden [(value)]=\"waiting\">\n <option value=\"\">{{ text.waitingFilter }}: {{ text.waitingAny }}</option>\n @for (w of waitingValues; track w) {\n <option [value]=\"w\">{{ text.waiting[w] }}</option>\n }\n </hm-select>\n <button type=\"button\" class=\"as-filters__more\" [class.as-filters__more--on]=\"extraFilters() > 0\"\n [attr.aria-expanded]=\"moreFilters()\" [attr.aria-controls]=\"moreFilters() ? 'as-more-filters' : null\"\n (click)=\"moreFilters.set(!moreFilters())\">\n <hm-icon shape=\"filter\" />{{ moreFiltersText() }}\n </button>\n <span class=\"as-filters__spacer\"></span>\n <hm-select class=\"as-filters__select as-filters__sort\" [label]=\"text.sort\" labelHidden [value]=\"sort()\" (valueChange)=\"sort.set($any($event))\">\n @for (k of sortKeys; track k) {\n <option [value]=\"k\">{{ text.sort }}: {{ sortLabel(k) }}</option>\n }\n </hm-select>\n </div>\n @if (moreFilters()) {\n <div class=\"as-filters as-filters--more\" id=\"as-more-filters\">\n <hm-select class=\"as-filters__select\" [label]=\"text.groupFilter\" labelHidden [(value)]=\"group\">\n <option value=\"\">{{ text.allGroups }}</option>\n @for (g of groupOptions(); track g.id) {\n <option [value]=\"g.id\">{{ g.name }}</option>\n }\n <option value=\"none\">{{ text.noGroups }}</option>\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.authorFilter\" labelHidden [(value)]=\"author\">\n <option value=\"\">{{ text.allAuthors }}</option>\n @for (p of authors(); track p.user_id) {\n <option [value]=\"p.user_id\">{{ personName(p) }}</option>\n }\n </hm-select>\n </div>\n }\n <div class=\"as-suggestions__status\">\n @if (sort() !== 'position') {\n <p class=\"as-suggestions__hint\">{{ text.sortHint }}</p>\n }\n @if (isFiltered()) {\n <span class=\"as-suggestions__count\" aria-live=\"polite\">{{ filteredText() }}</span>\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"filter-close\" (clicked)=\"clearFilters()\">{{ text.clearFilters }}</hm-button>\n }\n </div>\n\n @if (!loading() && all().length === 0) {\n <hm-empty icon=\"lightbulb\" [heading]=\"text.boardEmpty\" [description]=\"text.boardEmptyHint\" />\n }\n\n <hm-kanban class=\"as-board\" [label]=\"text.boardLabel\" [columns]=\"columns()\" [itemKey]=\"itemKey\" [itemLabel]=\"itemLabel\"\n (moved)=\"onMoved($event)\">\n <!-- \"+\" no cabeçalho: abre o cadastro completo (o modal da \"Nova tarefa\") já nesta coluna. -->\n <ng-template hmKanbanColumnActions let-column>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"plus\" [label]=\"newTaskInLabel(column.id)\" (clicked)=\"newTask(column.id)\" />\n </ng-template>\n\n <!-- Logo abaixo do cabeçalho: há quanto tempo a mais antiga está no status e quantas venceram. -->\n <ng-template hmKanbanColumnSummary let-column>\n @if (columnSummaries().get(column.id); as sum) {\n @if (sum.oldest) {\n <span class=\"as-colsum\"><hm-icon shape=\"clock\" />{{ sum.oldest }}</span>\n }\n @if (sum.overdue) {\n <span class=\"as-colsum as-colsum--late\"><hm-icon shape=\"alarm-clock\" />{{ sum.overdue }}</span>\n }\n }\n </ng-template>\n\n <!-- Coluna vazia: ícone grande, a frase e o que costuma cair nela (com filtro, \"nenhuma com estes filtros\"). -->\n <ng-template hmKanbanColumnEmpty let-column>\n <span class=\"as-colempty\">\n <hm-icon class=\"as-colempty__icon\" [shape]=\"emptyIcon(column.id)\" />\n <span class=\"as-colempty__title\">{{ text.columnEmpty }}</span>\n <span class=\"as-colempty__hint\">{{ emptyHint(column.id) }}</span>\n </span>\n </ng-template>\n\n <!-- Rodapé: \"+ Criar tarefa\" abre o mesmo cadastro, com o status da coluna já escolhido. -->\n <ng-template hmKanbanColumnFooter let-column>\n <button type=\"button\" class=\"as-colfoot\" (click)=\"newTask(column.id)\">\n <hm-icon shape=\"plus\" />{{ text.createTask }}<span class=\"as-sr-only\">: {{ column.title }}</span>\n </button>\n </ng-template>\n\n <ng-template hmKanbanCard let-item>\n <div class=\"as-card\" [class.as-card--top]=\"isTop(item)\">\n <div class=\"as-card__body\">\n <!-- Uma linha só: chave, tipo, prioridade (e o selo de mais votada) e o \"⋯\". -->\n <div class=\"as-card__top\">\n <span class=\"as-card__key\">{{ item.key }}</span>\n <span class=\"as-card__kind\" [attr.data-kind]=\"item.kind\"><hm-icon [shape]=\"kindIcon(item)\" />{{ kindLabel(item) }}</span>\n <span class=\"as-card__priority\" [attr.data-priority]=\"item.priority\">\n <hm-icon [shape]=\"priorityIcon(item)\" /><span class=\"as-sr-only\">{{ text.priority }}: </span>{{ priorityName(item) }}\n </span>\n @if (isTop(item)) {\n <span class=\"as-card__badge\" [attr.title]=\"text.topVoted\"><hm-icon shape=\"flame\" /><span class=\"as-sr-only\">{{ text.topVoted }}</span></span>\n }\n <span #menuAnchor class=\"as-card__menu\">\n <hm-menu-button size=\"small\" icon=\"ellipsis-vertical\" [showArrow]=\"false\" align=\"end\" [label]=\"menuLabel(item)\"\n [items]=\"menuOf(item)\" (chosen)=\"onMenu(item, $event, menuAnchor)\" />\n </span>\n </div>\n <button type=\"button\" class=\"as-card__title\" (click)=\"openDetail(item)\">{{ item.title }}</button>\n\n <!-- Tudo o que identifica e situa a tarefa, lado a lado (quebra quando falta largura): a tela (o caminho\n inteiro na dica), \"Nova tela\", rótulos, com quem está a vez, mensagens novas e o prazo. -->\n <div class=\"as-card__chips\">\n <span class=\"as-card__screen\" [class.as-card__screen--new]=\"item.screen.new\" [attr.title]=\"item.screen.label || null\">\n <hm-icon [shape]=\"item.screen.new ? 'plus' : 'application'\" />{{ screenNameOf(item) }}\n </span>\n @if (item.screen.new) { <span class=\"as-card__screen-tag\">{{ text.newScreenTag }}</span> }\n <!-- Os rótulos ocupam o resto da linha da tela; o que não cabe vira \"+N\" (não quebra a linha). -->\n @if (item.labels.length) {\n <spine-tag-row class=\"as-card__labels\" [label]=\"text.labels\" [items]=\"labelTags(item)\" />\n }\n @if (item.waiting_on && item.status !== 'concluida' && item.status !== 'recusada') {\n <hm-tag [name]=\"waitingName(item)\" [color]=\"waitingColor(item)\" />\n }\n @if (item.unread) { <span class=\"as-card__unread\">{{ unreadText(item.unread) }}</span> }\n @if (item.due_date) {\n <span class=\"as-card__due\" [attr.data-due]=\"dueOf(item) ?? 'closed'\"><hm-icon [shape]=\"dueIcon(item)\" />{{ dueText(item) }}</span>\n }\n </div>\n\n <!-- Com o checklist no cartão, a descrição sai (o checklist já diz o que falta). -->\n @if (!cardItems(item).length && excerpt(item); as ex) {\n <p class=\"as-card__excerpt\">{{ ex }}</p>\n }\n @if (cardItems(item).length && checklistOpen(item)) {\n <ul class=\"as-card__checklist\" [id]=\"'as-card-checklist-' + item.id\">\n @for (c of cardItems(item); track c.id) {\n <li>\n <button type=\"button\" class=\"as-card__check\" [attr.aria-pressed]=\"c.done\" (click)=\"toggleCardItem(item, c)\">\n <hm-icon [shape]=\"c.done ? 'check-circle' : 'circle-empty'\" /><span [class.as-card__done]=\"c.done\">{{ c.text }}</span>\n </button>\n </li>\n }\n </ul>\n }\n\n <!-- Rodapé: o checklist (abre e fecha os itens) à esquerda; contadores, data, quem pediu e os responsáveis à direita. -->\n <div class=\"as-card__foot\">\n @if (cardItems(item).length) {\n <button type=\"button\" class=\"as-card__checklist-toggle\" [class.as-card__count--full]=\"item.checklist.done === item.checklist.total\"\n [attr.aria-expanded]=\"checklistOpen(item)\" [attr.aria-controls]=\"checklistOpen(item) ? 'as-card-checklist-' + item.id : null\"\n (click)=\"toggleChecklist(item)\">\n <hm-icon shape=\"list-check\" />{{ cardChecklistText(item) }}<hm-icon [shape]=\"checklistOpen(item) ? 'angle-up' : 'angle-down'\" />\n </button>\n } @else if (item.checklist.total) {\n <span class=\"as-card__count\" [class.as-card__count--full]=\"item.checklist.done === item.checklist.total\" [attr.title]=\"checklistText(item)\">\n <hm-icon shape=\"list-check\" /><span aria-hidden=\"true\">{{ item.checklist.done }}/{{ item.checklist.total }}</span><span class=\"as-sr-only\">{{ checklistText(item) }}</span>\n </span>\n }\n <span class=\"as-card__spacer\"></span>\n <span class=\"as-card__count\" [class.as-card__count--zero]=\"!item.comments_count\" [attr.title]=\"commentsText(item.comments_count)\">\n <hm-icon shape=\"comment-message\" /><span aria-hidden=\"true\">{{ item.comments_count }}</span><span class=\"as-sr-only\">{{ commentsText(item.comments_count) }}</span>\n </span>\n <span class=\"as-card__count\" [class.as-card__count--on]=\"item.votes > 0\" [class.as-card__count--zero]=\"!item.votes\" [attr.title]=\"votesText(item.votes)\">\n <hm-icon shape=\"thumbs-up\" /><span aria-hidden=\"true\">{{ item.votes }}</span><span class=\"as-sr-only\">{{ votesText(item.votes) }}</span>\n </span>\n <span class=\"as-card__date\" [attr.title]=\"createdText(item)\">\n <hm-icon shape=\"clock\" /><span aria-hidden=\"true\">{{ date(item.created_at) }}</span><span class=\"as-sr-only\">{{ createdText(item) }}</span>\n </span>\n <!-- Quem pediu (a foto do autor e \"+N\" relatores das agrupadas) e, depois do fio, os responsáveis. -->\n @if (item.author) {\n <span class=\"as-card__requesters\" [attr.title]=\"requestersText(item)\">\n <hm-account-avatar size=\"small\" [name]=\"personName(item.author)\" [imageUrl]=\"item.author.picture\" />\n @if (item.reporters_count) { <span class=\"as-card__more\">{{ moreText(item.reporters_count) }}</span> }\n <span class=\"as-sr-only\">{{ requestersText(item) }}</span>\n </span>\n }\n <span class=\"as-card__faces\">\n @for (p of faces(item); track p.user_id) {\n <hm-account-avatar size=\"small\" [name]=\"personName(p)\" [imageUrl]=\"p.picture\" [attr.title]=\"personName(p)\" />\n } @empty {\n <span class=\"as-card__nobody\" [attr.title]=\"text.assigneeNone\">\n <hm-icon shape=\"user-circle\" /><span class=\"as-sr-only\">{{ text.assigneeNone }}</span>\n </span>\n }\n @if (moreFaces(item); as more) { <span class=\"as-card__more\">{{ more }}</span> }\n </span>\n </div>\n </div>\n </div>\n </ng-template>\n </hm-kanban>\n }\n } @else {\n <!-- Arquivo: arquivadas, recusadas e concluídas fora da janela do quadro, paginado no servidor. -->\n <div class=\"as-suggestions__filters\">\n <hm-search-field class=\"as-suggestions__search\" [label]=\"text.archiveSearch\" labelHidden [placeholder]=\"text.archiveSearch\"\n [landmark]=\"false\" [debounce]=\"300\" [value]=\"archiveSearch()\" (search)=\"onArchiveSearch($event)\" />\n <hm-select class=\"as-suggestions__select\" [label]=\"text.statusFilter\" labelHidden [value]=\"archiveStatus()\"\n (valueChange)=\"onArchiveFilter('status', $any($event))\">\n <option value=\"\">{{ text.statusFilter }}: {{ text.allStatuses }}</option>\n @for (st of statuses; track st) {\n <option [value]=\"st\">{{ text.statuses[st] }}</option>\n }\n </hm-select>\n <hm-select class=\"as-suggestions__select\" [label]=\"text.kindFilter\" labelHidden [value]=\"archiveKind()\"\n (valueChange)=\"onArchiveFilter('kind', $any($event))\">\n <option value=\"\">{{ text.allKinds }}</option>\n @for (k of kinds; track k) {\n <option [value]=\"k\">{{ text.kinds[k] }}</option>\n }\n </hm-select>\n @if (archiveTotal()) {\n <span class=\"as-suggestions__count\" aria-live=\"polite\">{{ archiveCountText() }}</span>\n }\n </div>\n\n @if (archiveError()) {\n <hm-alert variant=\"error\">{{ archiveError() }}</hm-alert>\n } @else if (!archiveLoading() && archived().length === 0) {\n <hm-empty icon=\"archive\" [heading]=\"text.archiveEmpty\" [description]=\"archiveEmptyHint()\" />\n } @else {\n <ul class=\"as-archive\" [attr.aria-label]=\"text.archiveLabel\" [attr.aria-busy]=\"archiveLoading() ? 'true' : null\">\n @for (s of archived(); track s.id) {\n <li class=\"as-archive__item\">\n <div class=\"as-archive__main\">\n <div class=\"as-archive__tags\">\n <span class=\"as-card__key\">{{ s.key }}</span>\n <hm-tag [name]=\"text.statuses[s.status]\" [color]=\"statusColors[s.status]\" />\n <hm-tag [name]=\"text.kinds[s.kind]\" [color]=\"kindColors[s.kind]\" />\n @if (s.merged_into; as into) {\n <!-- Agrupada: no arquivo, com o destino; os comentários ficam nela. -->\n <hm-tag [name]=\"text.mergedTag\" color=\"info\" />\n <button type=\"button\" class=\"as-archive__link\" (click)=\"openTask(into.id)\">{{ mergedIntoText(into.key) }}</button>\n } @else {\n <span class=\"as-archive__date\">{{ closedOn(s) }}</span>\n }\n </div>\n <button type=\"button\" class=\"as-card__title\" (click)=\"openDetail(s)\">{{ s.title }}</button>\n <div class=\"as-archive__meta\">\n <hm-account-avatar size=\"small\" [name]=\"personName(s.author)\" [imageUrl]=\"s.author?.picture\" />\n <span>{{ personName(s.author) }}</span>\n <span aria-hidden=\"true\">·</span>\n <span>{{ s.screen.label || text.noScreen }}</span>\n @if (s.votes) {\n <span aria-hidden=\"true\">·</span>\n <span>{{ votesText(s.votes) }}</span>\n }\n </div>\n </div>\n @if (s.merged_into) {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"unlink\" [loading]=\"reopening() === s.id\" (clicked)=\"unmergeFromArchive(s)\">\n {{ text.unmerge }}\n </hm-button>\n } @else if (s.archived_at) {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"unarchive\" [loading]=\"reopening() === s.id\" (clicked)=\"reopen(s)\">\n {{ text.menuRestore }}\n </hm-button>\n } @else if (s.status === 'recusada') {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"unarchive\" [loading]=\"reopening() === s.id\" (clicked)=\"reopen(s)\">\n {{ text.reopen }}\n </hm-button>\n }\n </li>\n }\n </ul>\n @if (archiveTotal() > archivePage().size) {\n <hm-paginator variant=\"simple\" [label]=\"text.pagination\" [state]=\"archivePage()\" [totalItems]=\"archiveTotal()\"\n [sizes]=\"[20, 50]\" (stateChanged)=\"onArchivePage($event)\" />\n }\n }\n }\n</div>\n\n\n<spine-suggestion-task-detail [clientId]=\"clientId()\" [task]=\"selected()\" [draft]=\"drafting()\" [draftStatus]=\"draftStatus()\"\n [labels]=\"catalog()\" [canOpenScreen]=\"canOpenScreen()\"\n (changed)=\"replace($event)\" (created)=\"onCreated($event)\" (removed)=\"onRemoved($event)\"\n (closed)=\"closeDetail()\" (labelCreated)=\"onLabelCreated($event)\"\n (mergeRequested)=\"startMerge($event)\" (openTask)=\"openTask($event)\" (unmerged)=\"onUnmerged()\" />\n\n<!-- \"Agrupar em…\" (do \"⋯\" do cartão ou do detalhe): as abertas do quadro, com a prévia do servidor. -->\n<spine-suggestion-merge-picker [clientId]=\"clientId()\" [source]=\"mergeSource()\" [candidates]=\"all()\"\n (merged)=\"onMerged($event)\" (closed)=\"mergeSource.set(null)\" />\n","import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from '../client-picker/auto-service-client-picker.component';\nimport { AutoServiceSuggestionsComponent } from '../tabs/auto-service-suggestions/auto-service-suggestions.component';\n\n/**\n * Tela \"Sugestões\" do auto-serviço (router `AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID`, na raiz do menu; migration\n * 0036 do argos): o seletor de client + o quadro de sugestões que era a aba Cliente › Sugestões. Carregada só por\n * `AUTO_SERVICE_SCREENS.suggestions` -- nunca exportada pelo ponto de entrada (ver `public-api.ts`).\n */\n@Component({\n selector: 'spine-auto-service-suggestions-page',\n imports: [AutoServiceClientPickerComponent, AutoServiceSuggestionsComponent],\n // Sem título/descrição internos: vêm da barra da página do spine (nome da rota + descrição do router AD100007).\n template: `\n <div class=\"as-stack\">\n <spine-auto-service-client-picker (clientChange)=\"client.set($event)\" />\n @if (client(); as c) {\n <spine-auto-service-suggestions [clientId]=\"c.id\" />\n }\n </div>\n `,\n styleUrl: './auto-service-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceSuggestionsPageComponent {\n protected readonly client = signal<AutoServiceClient | null>(null);\n}\n"],"names":["fold"],"mappings":";;;;;;;;;;;;;;AAkDA;AACO,MAAM,iCAAiC,GAAG,CAAC;AAC3C,MAAM,qCAAqC,GAAG,CAAC;AAEtD;;;;AAIG;MAEU,6BAA6B,CAAA;AAD1C,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACnC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAwJtD,IAAA;AAtJS,IAAA,GAAG,CAAC,OAA6B,EAAE,GAAG,GAAsB,EAAA;AAClE,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA,aAAA,EAAgB,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,EAAE;IAC1E;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;IAEQ,IAAI,CAAI,GAAW,EAAE,MAAmB,EAAA;QAC9C,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACjF;AAEA;;;AAGG;IACH,MAAM,KAAK,CAAC,QAAgB,EAAA;QAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CACzB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,cAAc,EAAE,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5E,OAAO;AACL,YAAA,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;AAClC,YAAA,QAAQ,EAAE,GAAG,CAAC,SAAS,IAAI,iCAAiC;AAC5D,YAAA,WAAW,EAAE,GAAG,CAAC,aAAa,IAAI,qCAAqC;SACxE;IACH;;AAGA,IAAA,MAAM,OAAO,CAAC,QAAgB,EAAE,CAAoC,EAAA;AAClE,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QAClG,IAAI,CAAC,CAAC,MAAM;YAAE,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACrD,IAAI,CAAC,CAAC,IAAI;YAAE,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;QAC/C,IAAI,CAAC,CAAC,MAAM;YAAE,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;AACrD,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAoD,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,cAAc,EAAE,MAAM,CAAC;AAC1H,QAAA,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,EAAE;IACtE;;IAGA,IAAI,CAAC,QAAgB,EAAE,EAAU,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAkB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,CAAC;IAC7E;;IAGA,MAAM,CAAC,QAAgB,EAAE,GAAW,EAAA;QAClC,OAAO,IAAI,CAAC,IAAI,CAAkB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,mBAAA,CAAqB,EAAE,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChH;IAEA,MAAM,CAAC,QAAgB,EAAE,KAA2B,EAAA;QAClD,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,YAAA,CAAc,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9H;AAEA,IAAA,MAAM,CAAC,QAAgB,EAAE,EAAU,EAAE,IAAyB,EAAA;AAC5D,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAkB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACpI;AAEA;;;AAGG;AACH,IAAA,IAAI,CAAC,QAAgB,EAAE,EAAU,EAAE,MAAmG,EAAA;AACpI,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAkB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACtI;IAEA,MAAM,CAAC,QAAgB,EAAE,EAAU,EAAA;QACjC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAO,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACpH;AAEA,IAAA,WAAW,CAAC,QAAgB,EAAE,EAAU,EAAE,QAAiB,EAAA;QACzD,MAAM,GAAG,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,QAAA,CAAU,GAAG,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,QAAA,CAAU;QAC1H,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5F;;AAGA,IAAA,YAAY,CAAC,QAAgB,EAAE,EAAU,EAAE,IAAY,EAAA;QACrD,OAAO,IAAI,CAAC,IAAI,CAAmB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxH;;AAGA,IAAA,KAAK,CAAC,QAAgB,EAAE,EAAU,EAAE,IAAY,EAAA;AAC9C,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,IAAI,CAAC,GAAG,CAAA,IAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,MAAA,CAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7I;;IAGA,OAAO,CAAC,QAAgB,EAAE,EAAU,EAAA;AAClC,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,QAAA,CAAU,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzI;;AAGA,IAAA,MAAM,CAAC,QAAgB,EAAE,EAAU,EAAE,CAAmE,EAAA;AACtG,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;AACjG,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,gBAAgB,EAAE,CAAA,OAAA,CAAS,EAAE,MAAM,CAAC;IAC3E;IAEA,OAAO,CAAC,QAAgB,EAAE,EAAU,EAAE,OAAe,EAAE,QAAQ,GAAG,KAAK,EAAA;AACrE,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAA6B,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,SAAA,CAAW,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACxK;;IAGA,QAAQ,CAAC,QAAgB,EAAE,EAAU,EAAA;AACnC,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAO,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,KAAA,CAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3H;;AAGA,IAAA,SAAS,CAAC,QAAgB,EAAE,EAAU,EAAE,MAAc,EAAE,IAAc,EAAA;AACpE,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,gBAAgB,EAAE,CAAA,OAAA,CAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/J;AAEA,IAAA,YAAY,CAAC,QAAgB,EAAE,EAAU,EAAE,MAAc,EAAE,IAAc,EAAA;AACvE,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAkB,IAAI,CAAC,GAAG,CAAA,IAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,QAAA,EAAW,MAAM,EAAE,EAAE;AACjH,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;AAClE,SAAA,CAAC,CAAC;IACL;AAEA,IAAA,gBAAgB,CAAC,QAAgB,EAAE,EAAU,EAAE,IAAY,EAAA;AACzD,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,IAAI,CAAC,GAAG,CAAA,IAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,UAAA,CAAY,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACjJ;AAEA,IAAA,mBAAmB,CAAC,QAAgB,EAAE,EAAU,EAAE,MAAc,EAAE,MAA4D,EAAA;AAC5H,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAkB,IAAI,CAAC,GAAG,CAAA,IAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1J;AAEA,IAAA,mBAAmB,CAAC,QAAgB,EAAE,EAAU,EAAE,MAAc,EAAA;AAC9D,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAkB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,WAAA,EAAc,MAAM,CAAA,CAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACnJ;;IAIA,MAAM,MAAM,CAAC,QAAgB,EAAA;AAC3B,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAiC,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,mBAAA,CAAqB,CAAC;AACtG,QAAA,OAAO,GAAG,CAAC,MAAM,IAAI,EAAE;IACzB;AAEA,IAAA,WAAW,CAAC,QAAgB,EAAE,IAAY,EAAE,KAAa,EAAA;AACvD,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAY,IAAI,CAAC,GAAG,CAAA,IAAI,QAAQ,CAAA,mBAAA,CAAqB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzI;AAEA,IAAA,QAAQ,CAAC,QAAgB,EAAE,EAAU,EAAE,OAAe,EAAE,MAAe,EAAA;AACrE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,CAAA,aAAA,EAAgB,EAAE,CAAA,QAAA,EAAW,OAAO,EAAE;QACtE,OAAO,cAAc,CAAC;AACpB,cAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAkB,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACnE,cAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAkB,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE;;AAIA,IAAA,MAAM,YAAY,CAAC,QAAgB,EAAE,MAAc,EAAA;AACjD,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,EAAE;AAAE,YAAA,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAC/D,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAgC,IAAI,CAAC,GAAG,CAAA,CAAA,CAAA,EAAI,QAAQ,QAAQ,EAAE,MAAM,CAAC;AAChG,QAAA,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;IACxB;+GA1JW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA7B,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,6BAA6B,cADhB,MAAM,EAAA,CAAA,CAAA;;4FACnB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBADzC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACzDlC;AACA;AACA;AAEO,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAU;AAG7E;AACO,MAAM,mBAAmB,GAAiC;AAC/D,IAAA,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc;CACzF;AAED;AACO,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU;AAwElH;AACM,SAAU,QAAQ,CAAC,QAAiB,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,EAAA;AAC1D,IAAA,IAAI;AACF,QAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IACtH;AAAE,IAAA,MAAM;QACN,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;IACvC;AACF;AAEA;AACM,SAAU,OAAO,CAAC,GAAW,EAAE,IAAY,EAAA;IAC/C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA,EAAG,GAAG,CAAA,UAAA,CAAY,CAAC;IACtC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AACrC;AAEA;AACM,SAAU,QAAQ,CAAC,IAAkD,EAAE,KAAa,EAAA;AACxF,IAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;AAAE,QAAA,OAAO,IAAI;AAC5F,IAAA,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK;AAAE,QAAA,OAAO,SAAS;AAC3C,IAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK;AAAE,QAAA,OAAO,OAAO;IAC3C,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AAAE,QAAA,OAAO,UAAU;AAC1D,IAAA,OAAO,OAAO;AAChB;AAEA;AACM,SAAU,WAAW,CAAC,IAAY,EAAE,EAAU,EAAA;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,EAAE,CAAA,UAAA,CAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY,CAAC,IAAI,UAAU,CAAC;AACnG;AAEA;AACM,SAAU,aAAa,CAAC,EAAU,EAAA;AACtC,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AACpD,IAAA,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE;AACjG;AAEA;AACO,MAAM,UAAU,GAAG,CAAC,IAAqB,EAAE,MAAc,KAAK,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC;;ACrHjI;AACA;AAEA;;;AAGG;MA4BU,+BAA+B,CAAA;AAa1C,IAAA,WAAA,GAAA;AAZmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;AAC3C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,6BAA6B,CAAC;AACvD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;;AAEnC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAoB,EAAE,8EAAC;QACtC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAoB;AAE3B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAqB,EAAE,4EAAC;AACpC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AACvB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,8EAAC;QAC/F,IAAA,CAAA,GAAG,GAAG,CAAC;QAGb,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrC,QAAA,CAAC,CAAC;IACJ;IAEU,MAAM,IAAI,CAAC,IAAY,EAAA;AAC/B,QAAA,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC,GAAG;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC;AACnE,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7C;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C;gBAAU;AACR,YAAA,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAChD;IACF;AAEU,IAAA,MAAM,CAAC,CAAmB,EAAA;AAClC,QAAA,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;IAC9C;+GAnCW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxBhC;;;;;;;;;;;;;;;;;;;;GAoBT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wgGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EArBS,sBAAsB,+GAAE,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAyB3C,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBA3B3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gCAAgC,WACjC,CAAC,sBAAsB,EAAE,oBAAoB,CAAC,EAAA,QAAA,EAC7C;;;;;;;;;;;;;;;;;;;;GAoBT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,wgGAAA,CAAA,EAAA;;AAwCjD;;;AAGG;MAiCU,8BAA8B,CAAA;AAhC3C,IAAA,WAAA,GAAA;AAiCqB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;AACnD,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAA8B,EAAE,6EAAC;AAC/C,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAoB,EAAE,+EAAC;QACvC,IAAA,CAAA,OAAO,GAAG,MAAM,EAAgD;QAChE,IAAA,CAAA,OAAO,GAAG,MAAM,EAAmC;QAEzC,IAAA,CAAA,MAAM,GAAG,iBAAiB;AAC1B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,EAAE,2EAAC;AACjB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAS,OAAO,4EAAC;AAC/B,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AACvC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,iBAAiB,EAAE;YAChD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClF,QAAA,CAAC,4EAAC;;AAEiB,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;AAC3C,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,iBAAiB,EAAE;AAChD,YAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;AAC9F,QAAA,CAAC,gFAAC;QACiB,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAYnH,IAAA;AAVW,IAAA,SAAS,CAAC,CAAS,EAAA;AAC3B,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9D;IAEU,MAAM,GAAA;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;AAC/B,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnB;+GA9BW,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,+BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA7B/B;;;;;;;;;;;;;;;;;;;;;;;;;AAyBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wgGAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA1BS,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,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,aAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA8BvD,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAhC1C,SAAS;+BACE,+BAA+B,EAAA,OAAA,EAChC,CAAC,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,EAAA,QAAA,EACzD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,wgGAAA,CAAA,EAAA;;;ACvFjD,MAAM,WAAW,GAAG,EAAE;AAEtB;AACO,eAAe,QAAQ,CAAC,KAAa,EAAA;AAC1C,IAAA,IAAI;QACF,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;AAC1C,QAAA,OAAO,IAAI;IACb;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,KAAK;IACd;AACF;AAEA;;;;;;;;;;;;;;;;;;;AAmBG;MAaU,6BAA6B,CAAA;AAmHxC,IAAA,WAAA,GAAA;AAlHiB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,6BAA6B,CAAC;AAC/C,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACrC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;QAC7C,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1D,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC3C,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAEvD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;;AAEnC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAyB,IAAI,2EAAC;AAC1C,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,KAAK,4EAAC;;AAEpB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAwB,YAAY,kFAAC;AACxD,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAA8B,EAAE,6EAAC;;AAE/C,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,KAAK,oFAAC;;QAG5B,IAAA,CAAA,OAAO,GAAG,MAAM,EAAmB;QACnC,IAAA,CAAA,OAAO,GAAG,MAAM,EAAmB;QACnC,IAAA,CAAA,OAAO,GAAG,MAAM,EAAmB;QACnC,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;;QAEvB,IAAA,CAAA,YAAY,GAAG,MAAM,EAAoB;;QAEzC,IAAA,CAAA,cAAc,GAAG,MAAM,EAAmB;;QAE1C,IAAA,CAAA,QAAQ,GAAG,MAAM,EAAU;;QAE3B,IAAA,CAAA,QAAQ,GAAG,MAAM,EAAQ;QAEf,IAAA,CAAA,QAAQ,GAAG,yBAAyB;QACpC,IAAA,CAAA,YAAY,GAAG,8BAA8B;QAC7C,IAAA,CAAA,aAAa,GAAG,wBAAwB;QACxC,IAAA,CAAA,aAAa,GAAG,+BAA+B;QAC/C,IAAA,CAAA,KAAK,GAAG,sBAAsB;QAC9B,IAAA,CAAA,UAAU,GAAG,4BAA4B;QACzC,IAAA,CAAA,UAAU,GAAG,eAAe;QAC5B,IAAA,CAAA,aAAa,GAAG,mBAAmB;QACnC,IAAA,CAAA,MAAM,GAAG,uBAAuB;QAChC,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;AAEtD,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAyB,IAAI,8EAAC;AAC9C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AACtB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;AACpB,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,2EAAC;AACvD,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACzC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;YACxB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAA,GAAA,EAAM,CAAC,CAAC,KAAK,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc;AAC/D,QAAA,CAAC,8EAAC;;AAGiB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAC5B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,EAAE,iFAAC;AACvB,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,yFAAC;AAClC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,EAAE,uFAAC;;AAG7B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,EAAE,8EAAC;AACpB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAgB,IAAI,+EAAC;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,EAAE,kFAAC;;;AAIxB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAsC,SAAS,0EAAC;AAC5D,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAA+B,EAAE,+EAAC;AACnD,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,CAAC,oFAAC;AACzB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAA+B,EAAE,+EAAC;AACnD,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,CAAC,oFAAC;AACzB,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK,oFAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,SAAS,CAAC,4BAA4B,2EAAC;AAC/D;;;AAGG;QACgB,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAqB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AAC3G,YAAA,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc;AAC9G,YAAA,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI;SACnG,CAAC,CAAC,gFAAC;;AAEa,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,GAAG,EAA2B;AAC7C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,EAAE,8EAAC;AACpB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,KAAK,sFAAC;AAC/B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,EAAE,mFAAC;AACzB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,KAAK,iFAAC;;AAG1B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,EAAE,iFAAC;AACvB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,EAAE,sFAAC;AAC5B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAS,UAAU,gFAAC;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAS,YAAY,kFAAC;AAC1C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAS,OAAO,oFAAC;AACvC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAgB,IAAI,iFAAC;AACxC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAgB,IAAI,+EAAC;AACtC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,EAAE,uFAAC;AAC7B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAW,EAAE,kFAAC;AAClC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,IAAI,oFAAC;AAE5B,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,qFAAC;QAC9F,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACnF,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACjF,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,qFAAC;AACrH,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAW,MAAK;AACxD,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,YAAA,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;AAC3C,QAAA,CAAC,mFAAC;AACiB,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AACxC,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;AACpB,YAAA,OAAO,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;AAChD,QAAA,CAAC,6EAAC;QAGA,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAC1B,SAAS,CAAC,MAAK;gBACb,IAAI,CAAC,KAAK,EAAE;AACZ,gBAAA,IAAI,IAAI;AAAE,oBAAA,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,qBAAA,IAAI,KAAK;oBAAE,IAAI,CAAC,UAAU,EAAE;AACnC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEU,EAAE,GAAA;QACV,OAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;IACzC;IAEQ,KAAK,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;IACzB;IAEQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACxC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B;IAEQ,MAAM,IAAI,CAAC,KAAsB,EAAA;AACvC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,KAAK,CAAC,EAAE;gBAAE;YAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAClE,KAAK,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC;AACtC,YAAA,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClG;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC;IACF;AAEU,IAAA,OAAO,CAAC,IAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IAC/B;;AAGQ,IAAA,KAAK,CAAC,IAAqB,EAAA;AACjC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,QAAA,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE;AACrE,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB;;AAGQ,IAAA,MAAM,GAAG,CAAC,IAAoC,EAAE,OAAgB,EAAA;QACtE,IAAI,IAAI,CAAC,IAAI,EAAE;AAAE,YAAA,OAAO,KAAK;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;AACxB,YAAA,IAAI,OAAO;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;AACxC,YAAA,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,UAAU;gBAAE,KAAK,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC;AACrE,YAAA,OAAO,IAAI;QACb;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AACrC,YAAA,OAAO,KAAK;QACd;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;IACF;AAEQ,IAAA,IAAI,CAAC,KAA6D,EAAA;AACxE,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;IACvG;;IAIU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEU,IAAA,MAAM,SAAS,GAAA;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;AACtC,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE;AAC7C,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B;QACF;QACA,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9D;AAEU,IAAA,UAAU,CAAC,KAAoB,EAAA;AACvC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACzB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,KAAK,IAAI,CAAC,SAAS,EAAE;QACvB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YACjC,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9B;IACF;IAEU,gBAAgB,GAAA;AACxB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,IAAI,EAAE,CAAC;AACjE,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;IACnC;AAEU,IAAA,MAAM,eAAe,GAAA;AAC7B,QAAA,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;AAAE,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;IACxG;;;AAKQ,IAAA,QAAQ,CAAC,CAAkB,EAAA;QACjC,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;AAChC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;IACrE;;AAGU,IAAA,aAAa,CAAC,KAAa,EAAA;AACnC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,MAAM,OAAO,IAAI,KAAK,IAAI,IAAI,CAAkC;QAChE,IAAI,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC;YAAE;AAC9C,QAAA,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAI,EAAG,IAAI,EAAE;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/G;;AAGU,IAAA,SAAS,CAAC,CAAkB,EAAA;QACpC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IACnH;AAEU,IAAA,UAAU,CAAC,KAAa,EAAA;AAChC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1E;AAGU,IAAA,YAAY,CAAC,MAAc,EAAA;AACnC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE;AAC/B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAA+B,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IACnI;AAEU,IAAA,UAAU,CAAC,IAAY,EAAA;AAC/B,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI;YAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAA2B,EAAE,CAAC;IAC1F;AAEU,IAAA,cAAc,CAAC,QAAgB,EAAA;AACvC,QAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ;YAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAwB,EAAE,CAAC;IACnG;IAEU,UAAU,CAAC,KAAgC,EAAE,KAAoB,EAAA;AACzE,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC;YAAE;AACxC,QAAA,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;IAC5C;AAEU,IAAA,qBAAqB,CAAC,EAAW,EAAA;AACzC,QAAA,IAAI,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB;YAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IACzF;IAEU,QAAQ,GAAA;AAChB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC;AAAE,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;IACxH;AAEU,IAAA,SAAS,CAAC,MAAwB,EAAE,IAAc,EAAE,OAAyB,EAAA;QACrF,OAAO,CAAC,KAAK,EAAE;AACf,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC;AAAE,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5F;IAEU,YAAY,CAAC,MAA6B,EAAE,IAAc,EAAA;AAClE,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC;AAAE,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpG;IAEU,WAAW,CAAC,KAAuB,EAAE,MAAe,EAAA;AAC5D,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACxB,IAAI,CAAC,CAAC,EAAE;YACN,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACnH;QACF;AACA,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrF;AAEU,IAAA,MAAM,WAAW,CAAC,IAAY,EAAE,KAAa,EAAA;AACrD,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC;YAC1E,MAAM,KAAK,GAAqB,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE;AACrD,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;QAC/B;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC;IACF;AAEU,IAAA,MAAM,OAAO,GAAA;AACrB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,CAAC;YAAE;AACR,QAAA,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;;YAC7D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAC5C;AAEU,IAAA,UAAU,CAAC,IAAY,EAAA;QAC/B,OAAO,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI;IACxD;;IAGU,UAAU,CAAC,KAAiB,EAAE,IAAY,EAAA;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM;YAAE;QAC5G,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAClB,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;IACtC;IAEU,cAAc,GAAA;AACtB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,CAAC;YAAE;AACR,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW;AAC9B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IAC5I;AAEU,IAAA,MAAM,MAAM,GAAA;AACpB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,CAAC;YAAE;QACR,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa;YACjG,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI;AACpD,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACrC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACtB;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC;IACF;;;AAKU,IAAA,MAAM,WAAW,GAAA;AACzB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACxB,IAAI,CAAC,CAAC,EAAE,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE;AACpC,QAAA,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE;AAC7H,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QACtB;IACF;;IAGU,MAAM,aAAa,CAAC,MAAwB,EAAA;AACpD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,CAAC;YAAE;QACR,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,YAAW;AACnC,YAAA,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;AACtD,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;AACjD,QAAA,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/D,QAAA,IAAI,EAAE;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IAC9B;;AAGU,IAAA,WAAW,CAAC,CAAkB,EAAA;AACtC,QAAA,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM;YAAE,OAAO,CAAC,CAAC,SAAS;AAC3C,QAAA,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACpI;;IAGU,YAAY,CAAC,CAAkB,EAAE,CAAe,EAAA;AACxD,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc;QACxD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC;QACnE,OAAO,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;IAChF;AAEU,IAAA,cAAc,CAAC,GAAW,EAAA;AAClC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC;IACrD;AAEU,IAAA,cAAc,CAAC,GAAW,EAAA;AAClC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC;IACrD;AAEU,IAAA,YAAY,CAAC,GAAW,EAAA;AAChC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC;IACvD;;IAIU,OAAO,GAAA;AACf,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE;AAClC,QAAA,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI;YAAE;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1H;AAEU,IAAA,YAAY,CAAC,KAAoB,EAAA;AACzC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACzB,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,OAAO,EAAE;QAChB;IACF;IAEU,UAAU,CAAC,IAAuB,EAAE,IAAa,EAAA;AACzD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;AAAE,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9H;AAEU,IAAA,WAAW,CAAC,IAAuB,EAAA;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;AAEU,IAAA,UAAU,CAAC,IAAuB,EAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACxB,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI;AAAE,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACtI;IAEU,WAAW,CAAC,KAAoB,EAAE,IAAuB,EAAA;AACjE,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACzB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YACjC,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB;IACF;IAEU,QAAQ,CAAC,IAAuB,EAAE,KAAa,EAAA;AACvD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AACtE,QAAA,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK;AAC5B,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM;YAAE;AAC7E,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7G;AAEU,IAAA,UAAU,CAAC,IAAuB,EAAA;AAC1C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F;;AAIU,IAAA,SAAS,CAAC,GAAW,EAAA;AAC7B,QAAA,MAAM,IAAI,GAAG,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,UAAU,GAAG,GAAG,GAAG,SAAS;AACvE,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAClB,IAAI,IAAI,KAAK,SAAS;YAAE;QACxB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;IAClE;AAEU,IAAA,MAAM,UAAU,CAAC,IAA6B,EAAE,KAAc,EAAA;AACtE,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,IAAI,CAAC,CAAC;YAAE;AACR,QAAA,MAAM,IAAI,GAAG,IAAI,KAAK,UAAU,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAChE,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,UAAU,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa;AAC3E,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAC7H,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE;gBAAE;YACjC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AACzD,YAAA,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3B;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC;gBAAU;AACR,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;IAEU,MAAM,WAAW,CAAC,IAAa,EAAA;AACvC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE;AAC/C,QAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;AAC/D,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;AAChG,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;AAChD,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACvC,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,YAAA,MAAM,OAAO,GAAG;gBACd,GAAG,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,GAAG,CAAC;AAC1C,gBAAA,aAAa,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;AAC3D,gBAAA,IAAI,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;AAChH,gBAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,MAAM,KAAK;AAC7D,sBAAE,EAAE,GAAG,EAAE,UAAU,EAAE,aAAsB,EAAE,aAAa,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;aAClF;AACD,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;AAC1B,YAAA,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE;QAC5B;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAC/C;gBAAU;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B;IACF;;AAIU,IAAA,MAAM,MAAM,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;AACtC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AAC9D,QAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AACtD,gBAAA,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAyB,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAA2B;AACzG,gBAAA,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAkB,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;gBACxG,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE;gBACxE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,GAAG,EAAE;AAC7E,aAAA,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AACzC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACzC;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;IACF;;AAIU,IAAA,UAAU,CAAC,CAA2C,EAAA;AAC9D,QAAA,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa;IAC1D;AAEU,IAAA,WAAW,CAAC,MAAqB,EAAA;AACzC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,GAAG;AACvB,QAAA,OAAQ,IAAI,CAAC,IAAI,CAAC,QAAmC,CAAC,MAAM,CAAC,IAAK,IAAI,CAAC,IAAI,CAAC,cAAyC,CAAC,MAAM,CAAC,IAAI,MAAM;IACzI;;IAGQ,SAAS,CAAC,KAAgC,EAAE,KAAgC,EAAA;AAClF,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,GAAG;QACtB,IAAI,KAAK,KAAK,UAAU;YAAE,OAAQ,IAAI,CAAC,IAAI,CAAC,UAAqC,CAAC,KAAK,CAAC,IAAI,KAAK;QACjG,IAAI,KAAK,KAAK,MAAM;YAAE,OAAQ,IAAI,CAAC,IAAI,CAAC,KAAgC,CAAC,KAAK,CAAC,IAAI,KAAK;AACxF,QAAA,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1E,QAAA,OAAO,KAAK;IACd;AAEU,IAAA,SAAS,CAAC,CAA6B,EAAA;QAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;AACpE,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;AAAE,YAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC;AACjF,QAAA,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;AAAE,YAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;AACzJ,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO;AAChC,QAAA,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAA,EAAG,KAAK,CAAA,QAAA,CAAU,GAAG,KAAK;AAC/G,QAAA,MAAM,QAAQ,GAAI,IAAI,CAAC,IAAI,CAAC,QAAmC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;AACpG,QAAA,OAAO,aAAa,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IACjI;AAEU,IAAA,UAAU,CAAC,CAAkB,EAAA;QACrC,IAAI,CAAC,CAAC,CAAC,aAAa;AAAE,YAAA,OAAO,EAAE;AAC/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;AACzC,QAAA,OAAO,CAAC,CAAC,aAAa,CAAC;cACnB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;AAC7F,cAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC;IAC1D;AAEU,IAAA,OAAO,CAAC,CAAkB,EAAA;QAClC,IAAI,CAAC,CAAC,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;AAC1B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE;QAC7B,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5F,IAAI,CAAC,KAAK,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ;QAC5C,IAAI,CAAC,KAAK,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW;QAClD,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvE;AAEU,IAAA,iBAAiB,CAAC,CAAwB,EAAA;AAClD,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E;IAEU,SAAS,CAAC,QAAgB,EAAE,IAAuB,EAAA;AAC3D,QAAA,OAAO,aAAa,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACrD;AAEU,IAAA,GAAG,CAAC,GAAW,EAAA;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC;AACzE,QAAA,MAAM,KAAK,GAAiD,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC7K,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACvF,YAAA,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK;AAAE,gBAAA,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;AAAE,oBAAA,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC;YACrH,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC;QAChC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACvB;IACF;AAEU,IAAA,IAAI,CAAC,GAAW,EAAE,QAAQ,GAAG,KAAK,EAAA;AAC1C,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE;gBACxD,SAAS,EAAE,OAAO,EAAE,IAAI,QAAQ,GAAG,EAAE,SAAS,EAAE,OAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE;aACzH,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B;AAAE,QAAA,MAAM;YACN,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACzB;IACF;;AAGU,IAAA,GAAG,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAA,EAAG,GAAG,CAAA,UAAA,CAAY,CAAC,CAAC;QACzI;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,GAAG;QACZ;IACF;+GAnoBW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,MAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA0EN,4BAA4B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChJhE,g8sBAoWA,4kVDvSI,sBAAsB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,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,iTAAE,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,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,aAAA,EAAA,KAAA,EAAA,KAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,sOACpH,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,sKAAE,gBAAgB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,uBAAuB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,qVAC3G,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,8BAA8B,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,+BAA+B,iIAChF,4BAA4B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,EAAA,aAAA,EAAA,WAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,gJAAE,YAAY,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,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;;4FAMrG,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAZzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,EAAA,OAAA,EAC/B;wBACP,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB;wBACpH,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,iBAAiB;wBAC3G,eAAe,EAAE,8BAA8B,EAAE,+BAA+B;wBAChF,4BAA4B,EAAE,oBAAoB,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB;qBAClI,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,g8sBAAA,EAAA,MAAA,EAAA,CAAA,ohVAAA,CAAA,EAAA;+lCA4Eb,4BAA4B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEtIhE;AACA,MAAMA,MAAI,GAAG,CAAC,CAAS,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;AAElF;AACA,MAAM,WAAW,GAAG,EAAE;AAEtB;;;;;AAKG;MA+EU,8BAA8B,CAAA;AAkCzC,IAAA,WAAA,GAAA;AAjCiB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,6BAA6B,CAAC;AAC/C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACrC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAE1C,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;;AAEnC,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAyB,IAAI,6EAAC;;AAE5C,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAA6B,EAAE,iFAAC;;QAGlD,IAAA,CAAA,MAAM,GAAG,MAAM,EAAwD;QACvE,IAAA,CAAA,MAAM,GAAG,MAAM,EAAQ;QAEb,IAAA,CAAA,YAAY,GAAG,8BAA8B;AAC7C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,EAAE,2EAAC;AACjB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAyB,IAAI,6EAAC;AAC7C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAA0B,IAAI,8EAAC;AAC/C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAC5B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;AAEpB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAClG,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACzC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,MAAM,IAAI,GAAGA,MAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,UAAU;AACnB,iBAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW;iBACnD,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAIA,MAAI,CAAC,CAAA,EAAG,CAAC,CAAC,GAAG,CAAA,CAAA,EAAI,CAAC,CAAC,KAAK,CAAA,CAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjE,iBAAA,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;AAC1B,QAAA,CAAC,8EAAC;;QAIA,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,MAAM,EAAE;YACb,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC9B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,MAAM,CAAC,IAAa,EAAA;AAC5B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IAC/B;IAEU,MAAM,IAAI,CAAC,MAAuB,EAAA;AAC1C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,MAAM,CAAC,EAAE;YAAE;AAChD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YACtF,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,MAAM,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QAChE;AAAE,QAAA,MAAM;YACN,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,MAAM,CAAC,EAAE;AAAE,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAClE;IACF;AAEU,IAAA,WAAW,CAAC,CAAmB,EAAA;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM;AACxC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAC3C,YAAA,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC;AACtD,YAAA,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC;AACvE,YAAA,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG;AAClB,SAAA,CAAC;IACJ;AAEU,IAAA,SAAS,CAAC,KAAa,EAAA;AAC/B,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IACzE;AAEU,IAAA,MAAM,OAAO,GAAA;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE;QACnD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;AAC9F,YAAA,OAAO,EAAE,CAAA,EAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAA,CAAE;AACxE,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;AACrC,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;AAC7E,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACjG,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC7C;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QACxC;gBAAU;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;IACF;+GAnGW,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,+BAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1E/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ykDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA9CS,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,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,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,oBAAoB,wNAAE,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;;4FA4ElF,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBA9E1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,+BAA+B,WAChC,CAAC,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,oBAAoB,EAAE,YAAY,CAAC,EAAA,eAAA,EAC7E,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,ykDAAA,CAAA,EAAA;;;ACtCH;AACA,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,WAAW,CAAqD;AACzI,MAAM,aAAa,GAAqC,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC;AACzG;AACA,MAAM,SAAS,GAAG,CAAC;AACnB;AACA,MAAM,KAAK,GAAG,CAAC;AACf,MAAM,YAAY,GAAG,EAAE;AACvB,MAAM,OAAO,GAAG,GAAG;AACnB;AACO,MAAM,qBAAqB,GAAG,UAAU;AAE/C,MAAM,aAAa,GAAiC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;AAC/F,MAAM,UAAU,GAAG,CAAC,CAAkB,EAAE,CAAkB,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;AAClI,MAAM,KAAK,GAAwE;AACjF,IAAA,QAAQ,EAAE,UAAU;IACpB,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;AACtD,IAAA,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;IAC1D,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7F,IAAA,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;CAC9F;AAED;AACA,MAAM,IAAI,GAAG,CAAC,CAAS,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;AAElF;AACA,MAAM,IAAI,GAAyD;AACjE,IAAA,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;CAChH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;MAcU,+BAA+B,CAAA;AA6M1C,IAAA,WAAA,GAAA;AA5MiB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,6BAA6B,CAAC;AAC/C,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACrC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,uBAAuB,CAAC;QAC7C,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1D,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC3C,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAE/C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,IAAI,IAAI;AAEnF,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;QAEzB,IAAA,CAAA,KAAK,GAAG,sBAAsB;QAC9B,IAAA,CAAA,QAAQ,GAAG,yBAAyB;QACpC,IAAA,CAAA,YAAY,GAAG,8BAA8B;QAC7C,IAAA,CAAA,WAAW,GAAG,6BAA6B;QAC3C,IAAA,CAAA,UAAU,GAAG,4BAA4B;QACzC,IAAA,CAAA,aAAa,GAAG,wBAAwB;QACxC,IAAA,CAAA,aAAa,GAAG,+BAA+B;QAC/C,IAAA,CAAA,cAAc,GAAG,gBAAgB;QACjC,IAAA,CAAA,UAAU,GAAG,eAAe;AAC5B,QAAA,IAAA,CAAA,QAAQ,GAAuB,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;QACjF,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;AAEtD,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAO,OAAO,2EAAC;AAC5B,QAAA,IAAA,CAAA,WAAW,GAA+B;AAC3D,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE;AACpE,YAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;SACpE;;AAGkB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAoB,EAAE,0EAAC;AACnC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAqB,EAAE,8EAAC;AACxC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,iCAAiC,+EAAC;AACpD,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AACtB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,EAAE,6EAAC;AACnB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAS,EAAE,2EAAC;AACzB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAS,EAAE,6EAAC;AAC3B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAS,EAAE,6EAAC;;AAE3B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAS,EAAE,+EAAC;AAC7B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAS,EAAE,4EAAC;AAC1B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAS,EAAE,+EAAC;;AAE7B,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAS,EAAE,0EAAC;;AAExB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAS,EAAE,6EAAC;;AAE3B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAS,EAAE,8EAAC;;AAE5B,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAS,EAAE,4EAAC;AAC1B,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAU,UAAU,2EAAC;;AAElC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK,kFAAC;QAC3B,IAAA,CAAA,aAAa,GAAG,cAAc;;QAE9B,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACnF,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,YAAY;AACpE,cAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAErF,QAAA,IAAA,CAAA,EAAE,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,yEAAC;AAErD,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC1C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AACvC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC;AACrE,YAAA,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;AACxG,gBAAA,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AAC1G,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;YACpB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;AACpD,oBAAC,CAAC,MAAM,KAAK,MAAM,KAAK,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC;AACtG,oBAAC,CAAC,OAAO,KAAK,CAAC,CAAC,UAAU,KAAK,OAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3E,oBAAC,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;oBAC1F,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM;AACxC,oBAAC,CAAC,QAAQ,KAAK,QAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC;oBAChH,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC;oBAC9C,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ;oBACpC,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC;AAChC,oBAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACzD,uBAAA,IAAI,CAAC,CAAA,EAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,CAAA,CAAA,EAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA,CAAA,EAAI,CAAC,CAAC,GAAG,CAAA,CAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3H,QAAA,CAAC,+EAAC;AACiB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM;AAChH,eAAA,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,iFAAC;AACvG,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACtF,YAAA,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM;AACxF,SAAA,CAAC,mFAAC;AAEgB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAkC,MAAK;AAC1E,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AAChC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;YAC1B,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,MAAM;AAClF,gBAAA,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1G,aAAA,CAAC,CAAC;AACL,QAAA,CAAC,8EAAC;AAEF;;;AAGG;AACgB,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACjD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,YAAA,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACtC,gBAAA,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzG,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE;gBAC1E,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,MAAM;AACnF,gBAAA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;wBACZ,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE;wBAC5E,OAAO,EAAE,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;AACnG,qBAAA,CAAC;YACJ,CAAC,CAAC,CAAC;AACL,QAAA,CAAC,sFAAC;AAEF;;;AAGG;AACgB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACzC,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB;AACxC,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;gBAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;YAC1H,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC7G,QAAA,CAAC,8EAAC;QACiB,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACpE,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB;AACtC,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AAAE,gBAAA,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;oBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;YAClF,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACnG,QAAA,CAAC,mFAAC;AACiB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,8EAAC;QAC1E,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,sFAAC;;AAGjE,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE;YACvB,MAAM,KAAK,GAAG,CAAC,MAA6B,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM;YAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;AACzE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC;YACzD,OAAO;AACL,gBAAA,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC;gBACjF,kBAAkB,EAAE,KAAK,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM;gBACvE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;gBACzD,OAAO,EAAE,OAAO,CAAC,MAAM;;AAEvB,gBAAA,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM;AAClE,gBAAA,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI,EAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM;;AAEjH,gBAAA,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,KAAK,cAAc,CAAC,CAAC,MAAM;gBACvE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACrD,gBAAA,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;AAC1G,gBAAA,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;aAC9G;AACH,QAAA,CAAC,4EAAC;QACiB,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAEvF,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;AACvE,YAAA,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;SAC3I,CAAC,CAAC,gFAAC;AACe,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;AAC5D,cAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,kFAAC;AAC5F,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;AACzD,cAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,+EAAC;AACxF,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,iFAAC;;QAEjE,IAAA,CAAA,YAAY,GAAe,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;AACxE,YAAA,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,6BAA6B,CAAC,EAAE,CAAC;AAC/H,SAAA,CAAC,CAAC;QACgB,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,CAChD,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAG7E,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,4EAAC;QAEjF,IAAA,CAAA,OAAO,GAAG,CAAC,CAAkB,KAAK,CAAC,CAAC,EAAE;AACtC,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,CAAkB,KAAK,CAAA,EAAG,CAAC,CAAC,GAAG,CAAA,CAAA,EAAI,CAAC,CAAC,KAAK,EAAE;;AAGzD,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAoB,EAAE,+EAAC;AACxC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,CAAC,mFAAC;AACxB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,kFAAC;AACtE,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,EAAE,oFAAC;AAC1B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAS,EAAE,kFAAC;AAChC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAS,EAAE,oFAAC;AAClC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,KAAK,qFAAC;AAC9B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,EAAE,mFAAC;AACzB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,gFAAC;AACvC,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAC7C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACrE,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGvG,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAyB,IAAI,+EAAC;AAC/C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAwB,YAAY,kFAAC;QACzD,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAC1C,CAAC,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QAEzF,IAAA,CAAA,WAAW,GAAG,KAAK;;;AAsSR,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAyB,IAAI,kFAAC;;AAqPpD,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,qFAAC;QAxhBtE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;YAChC,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,gBAAA,KAAK,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC9B,gBAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS;oBAAE,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC;;AAC5D,oBAAA,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC/B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,MAAM,CAAC,EAA4D,EAAA;AACzE,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAiC;AACrD,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;AAAE,YAAA,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACzE,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG;IAEQ,UAAU,CAAC,CAAkB,EAAE,GAAW,EAAA;QAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;AACrC,QAAA,OAAO,GAAG,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,GAAG,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,UAAU;IAC5F;AAEU,IAAA,OAAO,CAAC,KAAa,EAAA;AAC7B,QAAA,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,GAAG,SAAS,GAAG,OAAO;AACtD,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;YAAE;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;;QAEnB,IAAI,IAAI,KAAK,SAAS;AAAE,YAAA,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;;AAC3C,YAAA,KAAK,IAAI,CAAC,IAAI,EAAE;IACvB;IAEU,OAAO,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS;YAAE,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC;;AACxE,YAAA,KAAK,IAAI,CAAC,IAAI,EAAE;IACvB;IAEU,MAAM,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAA;AAC7C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI;YACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjC,YAAA,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QAClC;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;IAEQ,MAAM,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAA;AACjD,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB;IACF;;IAGQ,MAAM,YAAY,CAAC,QAAgB,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC;AACpF,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG;YAAE;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;AAC/E,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;QACtE;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC;IACF;IAEU,YAAY,GAAA;AACpB,QAAA,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM;YAChI,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;AAC3B,YAAA,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACX;IACF;AAEA;;;AAGG;IACO,SAAS,CAAC,KAA8C,EAAE,EAAW,EAAA;QAC7E,IAAI,KAAK,KAAK,MAAM;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;aAClD,IAAI,KAAK,KAAK,SAAS;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,cAAc,GAAG,EAAE,CAAC;;AACnE,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC;IACpC;;AAGU,IAAA,cAAc,CAAC,CAAe,EAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7D;;AAGU,IAAA,aAAa,CAAC,KAAa,EAAA;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;AAC/B,QAAA,OAAO,KAAK,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG,GAAG,CAAC;IAC1C;IAEU,YAAY,CAAC,CAAe,EAAE,KAAa,EAAA;QACnD,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;IAC/F;AAEA;;;;AAIG;IACO,MAAM,OAAO,CAAC,KAAuC,EAAA;AAC7D,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;AACvB,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,EAA2B;AAC5C,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,EAAE;AACjC,QAAA,IAAI,MAA6D;AAEjE,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU,EAAE;YAC9B,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBACrC;YACF;AACA,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM;YAChF,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACxG,YAAA,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB;aAAO;YACL,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACtC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAC7F,YAAA,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM;AACzB,YAAA,IAAI,KAAK;gBAAE,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC;AAC5D,iBAAA,IAAI,KAAK;gBAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;YAE/E,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5G,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;kBACxD,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/F,MAAM,GAAG,EAAE,IAAI,OAAO,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;QAClE;AAEA,QAAA,IAAI;YACF,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACzE;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AACrC,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE;QACnB;IACF;;AAIA;;;AAGG;IACO,OAAO,CAAC,SAAiB,YAAY,EAAA;AAC7C,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAyC,CAAC,GAAI,MAAgC,GAAG,YAAY,CAAC;AAC3I,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;;AAGU,IAAA,cAAc,CAAC,MAAc,EAAA;QACrC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAA+B,CAAC,IAAI,MAAM,EAAE,CAAC;IACtH;;AAIU,IAAA,UAAU,CAAC,CAAkB,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS;YAAE,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC;IAC/E;AAEU,IAAA,SAAS,CAAC,IAAqB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEU,IAAA,SAAS,CAAC,IAAqB,EAAA;AACvC,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/D,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;AACpE,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrF,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEU,IAAA,cAAc,CAAC,KAAuB,EAAA;AAC9C,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F;AAEA;;;AAGG;AACO,IAAA,OAAO,CAAC,KAAsB,EAAA;QACtC,MAAM,KAAK,GAAG,CAAC,CAAkB,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;AAC5F,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW;QACxF,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AACzB,cAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;AACtC,cAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrF;;AAIQ,IAAA,SAAS,CAAC,CAAkB,EAAA;QAClC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AACjD,QAAA,MAAM,MAAM,GAAe,IAAI,CAAC,OAAO,EAAE,CAAC;cACtC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,EAAE,CAAA,CAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;cAC5G,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACzE,OAAO;AACL,YAAA;AACE,gBAAA,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc;gBAC/D,QAAQ,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;AAC/C,oBAAA,EAAE,EAAE,CAAA,OAAA,EAAU,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,MAAM,GAAG,OAAO,GAAG,6BAA6B,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,MAAM;AAClJ,iBAAA,CAAC,CAAC;AACJ,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACpF,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,YAAY,CAAC,CAAA,CAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3J,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa;AAChE,gBAAA,QAAQ,EAAE;oBACR,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACtC,wBAAA,EAAE,EAAE,CAAA,QAAA,EAAW,CAAC,CAAA,CAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,KAAK,CAAC,GAAG,OAAO,GAAG,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,KAAK,CAAC;AAClI,qBAAA,CAAC,CAAC;AACH,oBAAA,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,GAAG,cAAc,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE;AAC9H,iBAAA;AACF,aAAA;YACD,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE;AACzG,YAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC3E,YAAA,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE;AACtF,YAAA,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE;;YAE9D,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE;AAC7G,YAAA,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE;AACtF,YAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;SAC3E;IACH;AAEU,IAAA,MAAM,CAAC,CAAkB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;IACrC;AAEU,IAAA,SAAS,CAAC,CAAkB,EAAA;AACpC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1D;;AAGU,IAAA,MAAM,MAAM,CAAC,CAAkB,EAAE,EAAU,EAAE,MAAmB,EAAA;AACxE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;AACrC,QAAA,IAAI;YACF,IAAI,MAAM,KAAK,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAA8B,EAAE,CAAC,CAAC;iBACrH,IAAI,MAAM,KAAK,UAAU;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAqB,EAAE,CAAC,CAAC;AACvH,iBAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AAC7B,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,KAAK,MAAM,GAAG,IAAI,GAAG,KAA+B,EAAE,CAAC,CAAC;gBAClI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;YAC5C;AACK,iBAAA,IAAI,MAAM,KAAK,WAAW,EAAE;gBAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;gBAC/E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;YAC5C;AAAO,iBAAA,IAAI,MAAM,KAAK,OAAO,EAAE;AAC7B,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC;YACzG;AAAO,iBAAA,IAAI,MAAM,KAAK,WAAW,EAAE;gBACjC,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;;oBACvE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YAC5C;AAAO,iBAAA,IAAI,MAAM,KAAK,UAAU,EAAE;AAChC,gBAAA,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;;oBAC7D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YAC5C;AAAO,iBAAA,IAAI,MAAM,KAAK,OAAO,EAAE;AAC7B,gBAAA,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpB;AAAO,iBAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AAC/B,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;YAC7C;iBAAO,IAAI,MAAM,KAAK,QAAQ;AAAE,gBAAA,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC7D;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC;IACF;AAOU,IAAA,UAAU,CAAC,CAAkB,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB;;AAGU,IAAA,QAAQ,CAAC,KAA2D,EAAA;AAC5E,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IACjC;;IAGU,MAAM,QAAQ,CAAC,EAAU,EAAA;AACjC,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;AACzD,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC;IACF;;IAGU,UAAU,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS;YAAE,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC;;AACxE,YAAA,KAAK,IAAI,CAAC,IAAI,EAAE;IACvB;AAEU,IAAA,cAAc,CAAC,GAAW,EAAA;AAClC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC;IACrD;;IAGU,MAAM,kBAAkB,CAAC,CAAkB,EAAA;QACnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC1E,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC;QAChD;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B;IACF;IAEQ,MAAM,aAAa,CAAC,CAAkB,EAAA;QAC5C,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa;YACjG,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI;AACpD,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;AAChD,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACvC;;AAGQ,IAAA,MAAM,CAAC,CAAkB,EAAA;QAC/B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACxD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI;AAC5D,QAAA,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;AAC1E,QAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI,IAAI,qBAAqB,CAAA,CAAA,EAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;IACjF;;AAGU,IAAA,MAAM,cAAc,CAAC,CAAkB,EAAE,IAAuB,EAAA;AACxE,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5G;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACvC;IACF;;AAIU,IAAA,MAAM,WAAW,CAAC,IAAI,GAAG,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAA;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI;AACpC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;gBAC/C,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE;gBAC3E,IAAI,EAAE,IAAI,CAAC,WAAW,EAAkC,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAmC;AACxH,aAAA,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtC;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5C;gBAAU;AACR,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;QAChC;IACF;AAEU,IAAA,eAAe,CAAC,IAAY,EAAA;AACpC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1B;IAEU,eAAe,CAAC,KAAwB,EAAE,KAAa,EAAA;QAC/D,CAAC,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC;AACrE,QAAA,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1B;AAEU,IAAA,aAAa,CAAC,KAAsB,EAAA;AAC5C,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5D,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;IACnC;;IAGU,MAAM,MAAM,CAAC,CAAkB,EAAA;QACvC,IAAI,IAAI,CAAC,SAAS,EAAE;YAAE;QACtB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI;YACF,IAAI,CAAC,CAAC,WAAW;AAAE,gBAAA,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC;AAC/E,YAAA,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU;gBAAE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;YACrG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;YAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI;;YAEpC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;QACpF;AAAE,QAAA,MAAM;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;QACzC;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B;IACF;;AAIU,IAAA,SAAS,CAAC,CAAU,EAAA;QAC5B,IAAI,CAAC,KAAK,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ;QAC/C,IAAI,CAAC,KAAK,KAAK;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B;AAEU,IAAA,SAAS,CAAC,CAAkB,EAAA;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAChC;AAEU,IAAA,QAAQ,CAAC,CAAkB,EAAA;AACnC,QAAA,OAAO,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C;AAEU,IAAA,YAAY,CAAC,CAAkB,EAAA;AACvC,QAAA,OAAO,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxC;AAEU,IAAA,YAAY,CAAC,CAAkB,EAAA;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzC;AAEU,IAAA,KAAK,CAAC,CAAkB,EAAA;QAChC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAChC;AAEU,IAAA,OAAO,CAAC,CAAkB,EAAA;AAClC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;QACnD,OAAO,CAAC,CAAC,MAAM,GAAG,OAAO,GAAG,CAAA,EAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA,CAAA,CAAG,GAAG,CAAC;IACzE;AAEU,IAAA,KAAK,CAAC,CAAkB,EAAA;QAChC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;IACpC;AAEU,IAAA,SAAS,CAAC,CAAkB,EAAA;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK;QACvC,OAAO,IAAI,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE;IAChF;AAEU,IAAA,KAAK,CAAC,CAAkB,EAAA;QAChC,OAAO,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;IAChC;;AAGU,IAAA,OAAO,CAAC,CAAkB,EAAA;QAClC,IAAI,CAAC,CAAC,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7G;QACA,IAAI,KAAK,KAAK,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ;QAChD,IAAI,KAAK,KAAK,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW;QACtD,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChG,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IACvE;AAEU,IAAA,OAAO,CAAC,CAAkB,EAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS;AAAE,YAAA,OAAO,aAAa;AAC7C,QAAA,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,UAAU;AAAE,YAAA,OAAO,WAAW;AACjE,QAAA,OAAO,UAAU;IACnB;;AAGU,IAAA,YAAY,CAAC,CAAkB,EAAA;AACvC,QAAA,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY;QACjE,OAAO,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ;IAC1E;;AAGU,IAAA,WAAW,CAAC,CAAkB,EAAA;QACtC,OAAO,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;IAC5D;AAEU,IAAA,YAAY,CAAC,CAAkB,EAAA;AACvC,QAAA,OAAO,CAAC,CAAC,UAAU,GAAG,+BAA+B,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,SAAS;IACjF;AAEU,IAAA,UAAU,CAAC,KAAa,EAAA;AAChC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1E;AAEU,IAAA,WAAW,CAAC,CAAkB,EAAA;QACtC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;IACpF;;AAGU,IAAA,SAAS,CAAC,MAAc,EAAA;QAChC,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB;AAC3D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAyC,CAAC,IAAI,EAAE;AACxF,QAAA,OAAO,aAAa,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;IACvD;AAEU,IAAA,SAAS,CAAC,MAAc,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,IAAI,6BAA6B,CAAC,MAA+B,CAAC,IAAI,OAAO,CAAC;IACnH;;AAGQ,IAAA,QAAQ,CAAC,EAAU,EAAA;AACzB,QAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9D,QAAA,IAAI,CAAC;AAAE,YAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/D,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IACzD;AAEU,IAAA,aAAa,CAAC,CAAkB,EAAA;QACxC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACvG;AAKU,IAAA,aAAa,CAAC,CAAkB,EAAA;QACxC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACxC;AAEU,IAAA,eAAe,CAAC,CAAkB,EAAA;QAC1C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACjC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACtC,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;AAGU,IAAA,SAAS,CAAC,CAAkB,EAAA;QACpC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;IACnH;;AAGU,IAAA,iBAAiB,CAAC,CAAkB,EAAA;AAC5C,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACzH;;AAGU,IAAA,cAAc,CAAC,CAAkB,EAAA;QACzC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzF,OAAO,CAAC,CAAC,eAAe,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,GAAG,GAAG;IAC/E;;AAGU,IAAA,QAAQ,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC;IAC1D;AAEU,IAAA,SAAS,CAAC,CAAkB,EAAA;AACpC,QAAA,OAAO,CAAC,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE;IAC1G;AAEU,IAAA,UAAU,CAAC,CAA2C,EAAA;AAC9D,QAAA,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa;IAC1D;AAEU,IAAA,SAAS,CAAC,KAAa,EAAA;AAC/B,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IACzE;AAEU,IAAA,YAAY,CAAC,KAAa,EAAA;AAClC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAC5E;AAEU,IAAA,QAAQ,CAAC,CAAkB,EAAA;QACnC,IAAI,CAAC,CAAC,WAAW;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAA,GAAA,EAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE;QAClF,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,KAAK,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS;QACrG,OAAO,aAAa,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;IAClF;;AAGU,IAAA,GAAG,CAAC,GAAW,EAAA;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC;AACzE,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACvF,YAAA,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI;AAAE,gBAAA,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;AAAE,oBAAA,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC;YACpH,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC;QAChC;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACvB;IACF;AAEU,IAAA,IAAI,CAAC,GAAW,EAAE,QAAQ,GAAG,KAAK,EAAA;AAC1C,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE;gBACxD,SAAS,EAAE,OAAO,EAAE,IAAI,QAAQ,GAAG,EAAE,SAAS,EAAE,OAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE;aACzH,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B;AAAE,QAAA,MAAM;YACN,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACzB;IACF;;AAGU,IAAA,GAAG,CAAC,GAAW,EAAA;AACvB,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAA,EAAG,GAAG,CAAA,UAAA,CAAY,CAAC,CAAC;QACrJ;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,GAAG;QACZ;IACF;+GA5zBW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA/B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,+BAA+B,sOCrG5C,+42BA4bA,EAAA,MAAA,EAAA,CAAA,yxpBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjWI,sBAAsB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,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,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,SAAA,EAAA,aAAA,EAAA,MAAA,EAAA,YAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,sOAAE,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,EAC3G,mBAAmB,EAAA,QAAA,EAAA,2BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,4BAA4B,+EAAE,0BAA0B,EAAA,QAAA,EAAA,kCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,2BAA2B,EAAA,QAAA,EAAA,mCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC1G,4BAA4B,+EAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,iBAAA,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,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,kBAAkB,kOACtF,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,SAAA,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,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,mIAAE,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,8BAA8B,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtH,6BAA6B,0QAAE,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;;4FAMlC,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAb3C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gCAAgC,EAAA,OAAA,EACjC;wBACP,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa;AAC3G,wBAAA,mBAAmB,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,2BAA2B;AAC1G,wBAAA,4BAA4B,EAAE,eAAe,EAAE,mBAAmB,EAAE,kBAAkB;AACtF,wBAAA,oBAAoB,EAAE,yBAAyB,EAAE,eAAe,EAAE,oBAAoB,EAAE,8BAA8B;AACtH,wBAAA,6BAA6B,EAAE,YAAY;qBAC5C,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+42BAAA,EAAA,MAAA,EAAA,CAAA,yxpBAAA,CAAA,EAAA;;;AE/FjD;;;;AAIG;MAgBU,mCAAmC,CAAA;AAfhD,IAAA,WAAA,GAAA;AAgBqB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAA2B,IAAI,6EAAC;AACnE,IAAA;+GAFY,mCAAmC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mCAAmC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAXpC;;;;;;;GAOT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4+CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EATS,gCAAgC,wGAAE,+BAA+B,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAahE,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAf/C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qCAAqC,WACtC,CAAC,gCAAgC,EAAE,+BAA+B,CAAC,EAAA,QAAA,EAElE;;;;;;;GAOT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,4+CAAA,CAAA,EAAA;;;"}