@trismegisto/spine 3.0.4 → 3.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{trismegisto-spine-auto-service-apps.usage-DeLfYMeO.mjs → trismegisto-spine-auto-service-apps.usage-po9Ds_SU.mjs} +21 -22
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-po9Ds_SU.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs → trismegisto-spine-auto-service-auto-service-audit.component-tfGcVR3i.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-BNtNWfiu.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-tfGcVR3i.mjs.map} +1 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-Cl7ahisu.mjs +65 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-Cl7ahisu.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-wu2tFGS7.mjs → trismegisto-spine-auto-service-auto-service-client.component-DzmlpLPu.mjs} +136 -87
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-DzmlpLPu.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-DHhbEiL4.mjs → trismegisto-spine-auto-service-auto-service-groups.component-2xCG_wS9.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-DHhbEiL4.mjs.map → trismegisto-spine-auto-service-auto-service-groups.component-2xCG_wS9.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs → trismegisto-spine-auto-service-auto-service-login-attempts.component-CRvxfSWD.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-B87vibNB.mjs.map → trismegisto-spine-auto-service-auto-service-login-attempts.component-CRvxfSWD.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-D-N-xXPN.mjs → trismegisto-spine-auto-service-auto-service.component-C4FBAefe.mjs} +89 -55
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-C4FBAefe.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-client.usage-CcJANb20.mjs → trismegisto-spine-auto-service-client.usage-B16r3IHk.mjs} +16 -12
- package/fesm2022/trismegisto-spine-auto-service-client.usage-B16r3IHk.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +7 -7
- package/fesm2022/trismegisto-spine.mjs +39 -3
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +22 -0
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-apps.usage-DeLfYMeO.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-DdtDk_xl.mjs +0 -51
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-DdtDk_xl.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-wu2tFGS7.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-D-N-xXPN.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-client.usage-CcJANb20.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service.component-C4FBAefe.mjs","sources":["../../../projects/ui/auto-service/src/tabs/auto-service-apps/modals/apps-modal/auto-service-apps-modal.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/modals/apps-modal/auto-service-apps-modal.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/modals/consumer-create/auto-service-consumer-create.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/modals/consumer-create/auto-service-consumer-create.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/operation-level.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/modals/consumer-permissions/auto-service-consumer-permissions.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/modals/consumer-permissions/auto-service-consumer-permissions.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/auto-service-app-access.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-access/auto-service-app-access.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-operations/auto-service-app-operations.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-operations/auto-service-app-operations.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/token-create/auto-service-token-create.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/token-create/auto-service-token-create.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/auto-service-app-tokens.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/tabs/app-tokens/auto-service-app-tokens.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-apps/auto-service-apps.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-apps/auto-service-apps.component.html","../../../projects/ui/auto-service/src/auto-service.component.ts","../../../projects/ui/auto-service/src/auto-service.component.html"],"sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ButtonComponent, CheckboxComponent, InputComponent, ModalComponent } from '@trismegisto/angular';\nimport { AutoServiceService } from '../../../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n@Component({\n selector: 'spine-auto-service-apps-modal',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, ButtonComponent, CheckboxComponent, InputComponent, ModalComponent],\n templateUrl: './auto-service-apps-modal.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-apps-modal.component.scss'],\n})\nexport class AutoServiceAppsModalComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n @Input() app: any = null;\n @Input() clientId = '';\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n @Output() saved = new EventEmitter<string | undefined>();\n\n readonly name = new FormControl('', { nonNullable: true, validators: [Validators.required] });\n readonly grants = new FormControl('client_credentials', { nonNullable: true });\n readonly enabled = new FormControl(true, { nonNullable: true });\n\n saving = false;\n constructor(private service: AutoServiceService) {}\n get isEdit(): boolean { return !!this.app?.id; }\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) { this.resetForm(); } }\n\n resetForm() {\n if (this.isEdit) {\n this.name.setValue(this.app.name);\n this.grants.setValue(this.app.allowed_grants?.join(', ') ?? '');\n this.enabled.setValue(this.app.enabled);\n } else {\n this.name.setValue('');\n this.grants.setValue('client_credentials');\n this.enabled.setValue(true);\n }\n }\n\n onModalOpenChange(value: boolean) { this.open = value; this.openChange.emit(value); }\n close() { this.onModalOpenChange(false); }\n\n async save() {\n this.saving = true;\n try {\n const allowed_grants = this.grants.value.split(',').map(s => s.trim()).filter(Boolean);\n if (this.isEdit) {\n await this.service.updateApp(this.clientId, this.app.id, { name: this.name.value, allowed_grants, enabled: this.enabled.value });\n this.saved.emit();\n } else {\n const res = await this.service.createApp(this.clientId, { name: this.name.value, allowed_grants });\n this.saved.emit(res.secret);\n }\n this.close();\n } finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\" [heading]=\"isEdit ? text.editApp : text.newApp\" (closed)=\"close()\">\n <div class=\"form-stack\">\n <hm-input [formControl]=\"name\" [label]=\"text.name\" />\n <hm-input [formControl]=\"grants\" [label]=\"text.grants\" placeholder=\"client_credentials\" />\n <hm-checkbox *ngIf=\"isEdit\" [formControl]=\"enabled\" [label]=\"text.active\" />\n </div>\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [disabled]=\"!name.value\" [loading]=\"saving\" (clicked)=\"save()\">{{ text.save }}</hm-button>\n </ng-container>\n</hm-modal>\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonComponent, ComboboxComponent, ComboboxOption, ModalComponent } from '@trismegisto/angular';\nimport { AutoServiceService } from '../../../../../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\n@Component({\n selector: 'spine-auto-service-consumer-create',\n standalone: true,\n imports: [CommonModule, ButtonComponent, ComboboxComponent, ModalComponent],\n templateUrl: './auto-service-consumer-create.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-consumer-create.component.scss'],\n})\nexport class AutoServiceConsumerCreateComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n @Input() clientId = '';\n @Input() appId = '';\n @Input() availableGroups: any[] = [];\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n @Output() created = new EventEmitter<void>();\n groupId = '';\n saving = false;\n constructor(private service: AutoServiceService) {}\n\n get groupOptions(): ComboboxOption[] {\n return this.availableGroups.map((g) => ({ value: g.id, label: g.type ? `${g.name} (${g.type.name})` : g.name }));\n }\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) { this.groupId = ''; } }\n onModalOpenChange(value: boolean) { this.open = value; this.openChange.emit(value); }\n close() { this.onModalOpenChange(false); }\n\n async save() {\n if (!this.groupId) return;\n this.saving = true;\n try { await this.service.createAppConsumer(this.clientId, this.appId, this.groupId); this.created.emit(); this.close(); }\n finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\" [heading]=\"text.newAccessHeading\" (closed)=\"close()\">\n <hm-combobox [label]=\"text.group\" [options]=\"groupOptions\" [value]=\"groupId\" (valueChange)=\"groupId = $event\"></hm-combobox>\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [disabled]=\"!groupId\" [loading]=\"saving\" (clicked)=\"save()\">{{ text.create }}</hm-button>\n </ng-container>\n</hm-modal>\n","import type { TagColor } from '@trismegisto/angular';\nimport type { SpineMessages } from '@trismegisto/spine';\n\n/**\n * Para quem a permissão de operação é dada: um grupo (pessoas logadas) ou um token de API (sem login).\n * - `group`: só `protected` depende de permissão. `public` e `optional` rodam para qualquer um e `private` para qualquer\n * autenticado: liberar uma delas não muda nada, e o admin-server recusa (400 `operation_not_protected`).\n * - `token`: o token não tem login, então nada vale para ele sem permissão: `protected`, `private` (e `optional`) só com\n * a operação liberada explicitamente. Só `public` dispensa o token, e o admin-server recusa (400 `operation_public`).\n */\nexport type PermissionMode = 'group' | 'token';\n\n/** A operação depende de permissão para esse modo (a caixa fica escolhível). */\nexport function requiresPermission(level: string | null | undefined, mode: PermissionMode = 'group'): boolean {\n if (mode === 'token') return level !== 'public';\n return level === 'protected';\n}\n\n/** Por que a operação não precisa de permissão (no idioma ativo); vazio quando precisa. */\nexport function freeAccessText(level: string | null | undefined, text: SpineMessages['autoService'], mode: PermissionMode = 'group'): string {\n if (requiresPermission(level, mode)) return '';\n if (mode === 'token') return text.publicNoToken;\n if (level === 'private') return text.freeForAuthenticated;\n if (level === 'public' || level === 'optional') return text.freeForAll;\n return text.freeNoPermission;\n}\n\n/**\n * Estado inicial da caixa de uma operação que NÃO depende de permissão: no grupo vem marcada (já vale para ele); no token\n * vem desmarcada (pública não passa pelo token). Nos dois casos desabilitada.\n */\nexport function freeChecked(mode: PermissionMode): boolean {\n return mode === 'group';\n}\n\n/**\n * Cor do selo de nível na aba Operações e no drawer de permissões, a mesma do painel do Argos: pública em verde,\n * privada em azul, protegida em amarelo; o resto (optional) neutro.\n */\nexport function levelTagColor(level: string | null | undefined): TagColor {\n if (level === 'public') return 'success';\n if (level === 'private') return 'info';\n if (level === 'protected') return 'warning';\n return 'neutral';\n}\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef, computed, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ButtonComponent, DataGridActionBarComponent, DrawerComponent, HermesToastService, IconComponent, TagColor, TagComponent, TreeComponent,\n TreeNodeTemplateDirective,\n} from '@trismegisto/angular';\nimport { AutoServiceService } from '../../../../../../auto-service.service';\nimport { autoServiceErrorText } from '../../../../../../auto-service-errors';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { TreeNode, TreeSelectionChange, formatMessage } from '@trismegisto/primitives';\nimport { PermissionMode, freeAccessText, levelTagColor, requiresPermission } from '../../../app-tokens/operation-level';\n\n/**\n * Nó da árvore de operações. Identificadores como \"origins:containers:tags:list\" quebram em ':': os segmentos\n * intermediários viram pastas e a folha é a operação.\n */\nexport interface OperationNode {\n key: string;\n name: string;\n isFolder: boolean;\n children: OperationNode[];\n // Só nas folhas:\n identifier?: string;\n operation_id?: string;\n method?: string;\n level?: string;\n description?: string;\n permissionId?: string;\n /**\n * Operação que não depende de permissão neste modo e sem permissão gravada: desabilitada, marcada no grupo (já vale\n * pelo nível) e desmarcada no token (pública não passa pelo token). Com uma permissão antiga gravada fica editável,\n * para dar para retirar.\n */\n locked?: boolean;\n}\n\n/** O que o modelo do nó (`hmTreeNode`) mostra: nome, método, nível, descrição e o contador da pasta. */\nexport interface OperationNodeInfo {\n name: string;\n isFolder: boolean;\n method?: string;\n level?: string;\n levelColor?: TagColor;\n description?: string;\n /** Só pastas: \"X de Y\" das operações escolhíveis dentro dela; vazio quando não há nenhuma. */\n count?: string;\n}\n\n/**\n * \"Gerenciar operações\" de um consumer da aplicação: árvore (`hm-tree`) das operações agrupadas pelo identificador, e a\n * diferença gravada ao confirmar. `mode` diz de quem é o consumer: `group` (aba Acessos; public/private/optional já valem\n * e vêm marcadas e travadas) ou `token` (aba Tokens; nada vem marcado, private/optional/protected são escolhíveis e\n * public fica travada e desmarcada).\n */\n@Component({\n selector: 'spine-auto-service-consumer-permissions',\n standalone: true,\n imports: [\n CommonModule, ButtonComponent, DataGridActionBarComponent, DrawerComponent, IconComponent, TagComponent, TreeComponent, TreeNodeTemplateDirective,\n ],\n templateUrl: './auto-service-consumer-permissions.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-consumer-permissions.component.scss'],\n})\nexport class AutoServiceConsumerPermissionsComponent implements OnChanges {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n protected readonly fmt = formatMessage;\n private readonly toast = inject(HermesToastService);\n @Input() clientId = '';\n @Input() appId = '';\n @Input() consumer: any = null;\n @Input() set mode(value: PermissionMode) { this.modeSig.set(value); }\n get mode(): PermissionMode { return this.modeSig(); }\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n loading = false;\n saving = false;\n private readonly modeSig = signal<PermissionMode>('group');\n\n readonly tree = signal<OperationNode[]>([]);\n /** Termo do filtro no topo do drawer; a árvore mostrada é `visibleTree`. */\n readonly filter = signal('');\n readonly visibleTree = computed(() => filterOperationTree(this.tree(), this.filter()));\n /** Nós visíveis por chave: marcar uma pasta com o filtro ativo só mexe nas operações que aparecem. */\n private readonly visibleByKey = computed(() => indexByKey(this.visibleTree()));\n /** Só operações escolhíveis (não travadas): é o que o consumer pode ganhar ou perder. */\n readonly selectedIds = signal<ReadonlySet<string>>(new Set());\n readonly expandedIds = signal<ReadonlySet<string>>(new Set());\n private originalSelectedIds: ReadonlySet<string> = new Set();\n\n /** Todos os nós (pastas e folhas) por chave. */\n private readonly nodesByKey = computed(() => indexByKey(this.tree()));\n private readonly leaves = computed(() => this.tree().flatMap(n => collectLeaves(n)));\n readonly lockedIds = computed<ReadonlySet<string>>(() => new Set(this.leaves().filter(l => l.locked).map(l => l.key)));\n /** Marcação mostrada na árvore: as escolhidas e, no GRUPO, as travadas (já valem para ele). No token as travadas\n * (public) aparecem desmarcadas. */\n readonly treeSelected = computed<ReadonlySet<string>>(() =>\n this.modeSig() === 'token' ? this.selectedIds() : new Set([...this.selectedIds(), ...this.lockedIds()]),\n );\n\n /** hm-tree é lista achatada com estado só em `selected`/`expanded`. O label leva o texto completo (nome, método,\n * nível, descrição e por que está travada, para leitor de tela); o que aparece vem do modelo `hmTreeNode`. */\n readonly treeNodes = computed<readonly TreeNode[]>(() => this.visibleTree().map(n => this.toTreeNode(n)));\n\n readonly nodeInfo = computed(() => {\n const selected = this.selectedIds();\n const map = new Map<string, OperationNodeInfo>();\n const walk = (nodes: OperationNode[]) => {\n for (const n of nodes) {\n if (n.isFolder) {\n const open = collectLeaves(n).filter(l => !l.locked);\n const marked = open.filter(l => selected.has(l.key)).length;\n map.set(n.key, {\n name: n.name, isFolder: true,\n count: open.length ? formatMessage(this.text.permissionsFolderCount, { marked, total: open.length }) : '',\n });\n walk(n.children);\n } else {\n map.set(n.key, {\n name: n.name, isFolder: false, method: n.method, level: n.level, levelColor: levelTagColor(n.level),\n description: n.description,\n });\n }\n }\n };\n walk(this.tree());\n return map;\n });\n\n constructor(private service: AutoServiceService) {}\n\n info(node: TreeNode): OperationNodeInfo {\n return this.nodeInfo().get(node.id) ?? { name: node.label, isFolder: !node.leaf };\n }\n\n private toTreeNode(node: OperationNode): TreeNode {\n if (node.isFolder) {\n const leaves = collectLeaves(node);\n return {\n id: node.key, label: node.name, leaf: false,\n // Pasta só com operações travadas: nada a marcar dentro dela.\n disabled: leaves.length > 0 && leaves.every(l => l.locked),\n children: node.children.map(c => this.toTreeNode(c)),\n };\n }\n const free = node.locked ? freeAccessText(node.level, this.text, this.modeSig()) : '';\n const label = `${node.name} — ${node.method} · ${node.level}${node.description ? ' · ' + node.description : ''}${free ? ' · ' + free : ''}`;\n return { id: node.key, label, leaf: true, disabled: !!node.locked };\n }\n\n /** Filtrar abre as pastas que sobraram, para as operações encontradas aparecerem sem clique. */\n onFilterChange(term: string) {\n this.filter.set(term);\n if (!term.trim()) return;\n this.expandedIds.update(current => new Set([...current, ...folderKeys(this.visibleTree())]));\n }\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) { this.reset(); } }\n close() { this.open = false; this.openChange.emit(false); }\n\n async reset() {\n this.loading = true;\n try {\n const [opsRes, permsRes] = await Promise.all([\n this.service.getAppOperations(this.clientId, this.appId),\n this.service.getAppPermissions(this.clientId, this.consumer.consumer_id),\n ]);\n const operations: any[] = opsRes.operations ?? [];\n const permissions: any[] = permsRes.permissions ?? [];\n const root: OperationNode[] = [];\n const sorted = [...operations].sort((a, b) => String(a.identifier).localeCompare(String(b.identifier)));\n for (const op of sorted) {\n const perm = permissions.find((p: any) => p.operation_id === op.operation_id);\n const segments: string[] = String(op.identifier).split(':');\n const leafName = segments.pop()!;\n let level = root;\n let path = '';\n for (const segment of segments) {\n path = path ? `${path}:${segment}` : segment;\n let folder = level.find(n => n.isFolder && n.name === segment);\n if (!folder) {\n // Chave da pasta termina em ':' para não colidir com uma operação de mesmo identifier (\"orders\" e \"orders:list\").\n folder = { key: `${path}:`, name: segment, isFolder: true, children: [] };\n level.push(folder);\n }\n level = folder.children;\n }\n level.push({\n key: op.identifier, name: leafName, isFolder: false, children: [], identifier: op.identifier,\n operation_id: op.operation_id, method: op.method, level: op.level, description: op.description,\n permissionId: perm?.permission_id,\n locked: !perm && !requiresPermission(op.level, this.mode),\n });\n }\n this.tree.set(root);\n const original = new Set(collectAll(root).filter(l => !l.locked && l.permissionId).map(l => l.key));\n this.originalSelectedIds = original;\n this.selectedIds.set(new Set(original));\n this.expandedIds.set(new Set());\n this.filter.set('');\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n /**\n * Mudança do hm-tree: com caixas ele emite só folhas habilitadas (ou o id da pasta sem folhas). Pasta vira as folhas\n * escolhíveis dela que estão à vista (com filtro, só as que casaram); folha travada e chave desconhecida são ignoradas.\n */\n onTreeChanged(changes: readonly TreeSelectionChange[]) {\n this.selectedIds.update(current => {\n const next = new Set(current);\n for (const change of changes) {\n const node = this.visibleByKey().get(change.id);\n if (!node) continue;\n for (const leaf of collectLeaves(node)) {\n if (leaf.locked) continue;\n if (change.selected) next.add(leaf.key); else next.delete(leaf.key);\n }\n }\n return next;\n });\n }\n\n get hasChanges(): boolean {\n const selected = this.selectedIds();\n if (selected.size !== this.originalSelectedIds.size) return true;\n for (const id of selected) if (!this.originalSelectedIds.has(id)) return true;\n return false;\n }\n\n /** Folha escolhível pela chave; `undefined` para pasta, operação travada ou chave desconhecida. */\n private leafByKey(key: string): OperationNode | undefined {\n const node = this.nodesByKey().get(key);\n return node && !node.isFolder && !node.locked ? node : undefined;\n }\n\n async confirm() {\n const selected = this.selectedIds();\n const isLeaf = (l: OperationNode | undefined): l is OperationNode => !!l;\n const toAdd = [...selected].filter(id => !this.originalSelectedIds.has(id)).map(id => this.leafByKey(id)).filter(isLeaf);\n const toRemove = [...this.originalSelectedIds].filter(id => !selected.has(id)).map(id => this.leafByKey(id)).filter(isLeaf);\n if (toAdd.length === 0 && toRemove.length === 0) { this.close(); return; }\n this.saving = true;\n try {\n for (const l of toAdd) { await this.service.addAppPermission(this.clientId, this.consumer.consumer_id, l.operation_id!); }\n for (const l of toRemove) { await this.service.removeAppPermission(this.clientId, this.consumer.consumer_id, l.permissionId!); }\n this.close();\n } catch (err) {\n // O drawer fica aberto; reabrir relê o que de fato ficou gravado.\n this.toast.error(autoServiceErrorText(err, this.text, this.text.permissionsSaveError));\n } finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n\nfunction collectLeaves(node: OperationNode): OperationNode[] {\n return node.isFolder ? node.children.flatMap(collectLeaves) : [node];\n}\n\nfunction collectAll(root: OperationNode[]): OperationNode[] {\n return root.flatMap(collectLeaves);\n}\n\nfunction indexByKey(root: OperationNode[]): Map<string, OperationNode> {\n const map = new Map<string, OperationNode>();\n const walk = (nodes: OperationNode[]) => { for (const n of nodes) { map.set(n.key, n); walk(n.children); } };\n walk(root);\n return map;\n}\n\nfunction folderKeys(root: OperationNode[]): string[] {\n return [...indexByKey(root).values()].filter(n => n.isFolder).map(n => n.key);\n}\n\n/** Minúsculo e sem acento: \"operacao\" casa com \"Operação\". */\nfunction normalize(value: string | undefined): string {\n return (value ?? '').normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n}\n\n/**\n * A árvore só com o que casa com o termo. A operação casa pelo identificador, método, nível ou descrição; a pasta que\n * casa pelo nome vem inteira. Pasta sem nada que case sai. Termo vazio devolve a árvore como está.\n */\nexport function filterOperationTree(nodes: OperationNode[], term: string): OperationNode[] {\n const needle = normalize(term.trim());\n if (!needle) return nodes;\n const walk = (list: OperationNode[]): OperationNode[] => list.flatMap((n) => {\n if (n.isFolder) {\n if (normalize(n.name).includes(needle)) return [n];\n const children = walk(n.children);\n return children.length ? [{ ...n, children }] : [];\n }\n const haystack = [n.identifier, n.method, n.level, n.description].map(normalize).join(' ');\n return haystack.includes(needle) ? [n] : [];\n });\n return walk(nodes);\n}\n","<hm-drawer [open]=\"open\" (openChange)=\"open = $event\" [heading]=\"fmt(text.operationsOf, { group: consumer?.group_name ?? '' })\" (closed)=\"close()\">\n <div *ngIf=\"loading\" class=\"loading-row\">{{ text.loading }}</div>\n\n <!-- Topo sem mensagens: só o filtro, com o mesmo visual da busca das grades. -->\n <hm-data-grid-action-bar *ngIf=\"!loading && tree().length\"\n [search]=\"filter()\" (searchChange)=\"onFilterChange($event)\"\n [placeholder]=\"text.filterOperations\" [label]=\"text.filterOperations\" />\n\n <ng-container *ngIf=\"!loading && treeNodes().length\">\n <!-- Grupo: só protected depende de permissão; public/private/optional já valem e aparecem marcadas e desabilitadas.\n Token: private/optional/protected só valem liberadas; public aparece desabilitada e desmarcada. -->\n <hm-tree\n [nodes]=\"treeNodes()\"\n [label]=\"text.permissionsTreeLabel\"\n [selected]=\"treeSelected()\"\n [(expanded)]=\"expandedIds\"\n (changed)=\"onTreeChanged($event)\"\n >\n <ng-template hmTreeNode let-node>\n @let item = info(node);\n <span class=\"cp-node\">\n <span class=\"cp-node__name\">{{ item.name }}</span>\n @if (item.isFolder) {\n @if (item.count) {\n <span class=\"cp-node__count\">{{ item.count }}</span>\n }\n } @else {\n <hm-tag [name]=\"item.method ?? ''\" color=\"neutral\" />\n <hm-tag [name]=\"item.level ?? ''\" [color]=\"item.levelColor ?? 'neutral'\" />\n @if (item.description) {\n <span class=\"cp-node__desc\">{{ item.description }}</span>\n }\n }\n </span>\n </ng-template>\n </hm-tree>\n </ng-container>\n\n <div class=\"empty-state\" *ngIf=\"!loading && tree().length > 0 && treeNodes().length === 0\">\n <hm-icon shape=\"search\" size=\"xl\"></hm-icon>\n <p>{{ fmt(text.noFilterMatch, { term: filter() }) }}</p>\n </div>\n\n <div class=\"empty-state\" *ngIf=\"!loading && tree().length === 0\">\n <hm-icon shape=\"filter-grid\" size=\"xl\"></hm-icon>\n <p>{{ text.noOperations }}</p>\n </div>\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [disabled]=\"!hasChanges\" [loading]=\"saving\" (clicked)=\"confirm()\">{{ text.confirmChanges }}</hm-button>\n </ng-container>\n</hm-drawer>\n","import { Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ButtonComponent, DataGridActionTriggered, DataGridCellDirective, DataGridComponent, DataGridRowAction, GridColumn, IconComponent, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { AutoServiceDeleteFeedback } from '../../../../auto-service-delete';\nimport { AutoServiceService } from '../../../../auto-service.service';\nimport { AutoServiceConsumerCreateComponent } from './modals/consumer-create/auto-service-consumer-create.component';\nimport { AutoServiceConsumerPermissionsComponent } from './modals/consumer-permissions/auto-service-consumer-permissions.component';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\n\ninterface ConsumerRow {\n consumer_id: string; group_name: string; group_type_name: string;\n /** Vínculo do grupo de administração: não é do auto-serviço (servidor antigo ainda devolve; a tela descarta). */\n group_is_admin?: boolean;\n}\n\n@Component({\n selector: 'spine-auto-service-app-access',\n standalone: true,\n imports: [\n CommonModule, ButtonComponent, IconComponent, DataGridComponent, DataGridCellDirective, TagComponent,\n AutoServiceConsumerCreateComponent, AutoServiceConsumerPermissionsComponent,\n ],\n templateUrl: './auto-service-app-access.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-app-access.component.scss'],\n})\nexport class AutoServiceAppAccessComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly deletion = inject(AutoServiceDeleteFeedback);\n @Input() clientId = '';\n @Input() appId = '';\n entries: ConsumerRow[] = [];\n availableGroups: any[] = [];\n loading = false;\n showCreate = false;\n showPermissions = false;\n activeConsumer: ConsumerRow | null = null;\n constructor(private service: AutoServiceService) {}\n\n readonly rowId = (c: ConsumerRow) => c.consumer_id;\n readonly columns = computed<GridColumn<ConsumerRow>[]>(() => [\n { key: 'group_name', title: this.text.colGroup, value: (c) => c.group_name, sortable: true },\n { key: 'group_type_name', title: this.text.colType, value: (c) => c.group_type_name, sortable: true },\n // Como no painel do Argos: \"Gerenciar operações\" é um botão na linha, não um item do menu.\n { key: 'operations', title: this.text.colOperations, value: () => '' },\n ]);\n readonly rowActions = computed<DataGridRowAction<ConsumerRow>[]>(() => [\n {\n id: 'delete', icon: 'trash', label: this.text.remove, danger: true,\n confirm: (c) => ({ heading: this.text.confirmRemoveConsumerHeading, message: formatMessage(this.text.confirmRemoveConsumer, { group: c.group_name }) }),\n },\n ]);\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['appId']) { this.load(); }\n if (changes['clientId']) { this.loadGroups(); }\n }\n\n async load() {\n if (!this.appId) { this.entries = []; return; }\n this.loading = true;\n try {\n const res = await this.service.getAppConsumers(this.clientId, this.appId);\n this.entries = (res.consumers ?? []).filter((c: ConsumerRow) => !c.group_is_admin);\n }\n finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n async loadGroups() {\n if (!this.clientId) { this.availableGroups = []; return; }\n const res = await this.service.getGroups(this.clientId);\n this.availableGroups = (res.groups ?? []).filter((g) => !g.is_admin);\n this.cdr.markForCheck();\n }\n\n openCreate() { this.showCreate = true; }\n async onCreated() { await this.load(); }\n /** Já confirmado pelo `confirm` da ação na grade. */\n async deleteConsumer(consumerId: string) {\n if (await this.deletion.run(() => this.service.deleteAppConsumer(this.clientId, consumerId))) await this.load();\n }\n openPermissions(consumer: ConsumerRow) { this.activeConsumer = consumer; this.showPermissions = true; }\n\n onAction(e: DataGridActionTriggered<ConsumerRow>): void {\n if (e.action === 'delete') void this.deleteConsumer(e.row.consumer_id);\n }\n}\n","<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"entries\"\n [rowId]=\"rowId\"\n [caption]=\"text.appAccessCaption\"\n [loading]=\"loading\"\n [rowActions]=\"rowActions()\"\n (actionTriggered)=\"onAction($event)\"\n [emptyMessage]=\"text.noAppAccess\"\n>\n <hm-button dataGridActions icon=\"plus\" (clicked)=\"openCreate()\">{{ text.newAccess }}</hm-button>\n <ng-template hmCell=\"group_type_name\" let-c>\n <hm-tag [name]=\"c.group_type_name\" color=\"neutral\" />\n </ng-template>\n <ng-template hmCell=\"operations\" let-c>\n <hm-button emphasis=\"minimal\" icon=\"shield\" (clicked)=\"openPermissions(c)\">{{ text.manageOperations }}</hm-button>\n </ng-template>\n</hm-data-grid>\n\n<spine-auto-service-consumer-create\n [clientId]=\"clientId\"\n [appId]=\"appId\"\n [availableGroups]=\"availableGroups\"\n [open]=\"showCreate\"\n (openChange)=\"showCreate = $event\"\n (created)=\"onCreated()\">\n</spine-auto-service-consumer-create>\n\n<spine-auto-service-consumer-permissions\n *ngIf=\"activeConsumer\"\n [clientId]=\"clientId\"\n [appId]=\"appId\"\n [consumer]=\"activeConsumer\"\n [open]=\"showPermissions\"\n (openChange)=\"showPermissions = $event\">\n</spine-auto-service-consumer-permissions>\n","import { Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DataGridCellDirective, DataGridComponent, GridColumn, TagColor, TagComponent } from '@trismegisto/angular';\nimport { AutoServiceService } from '../../../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { pluralMessage } from '@trismegisto/primitives';\nimport { levelTagColor } from '../app-tokens/operation-level';\n\ninterface OperationRow {\n operation_id: string; identifier: string; method: string; level: string; description?: string; allowed_groups?: any[];\n}\n\n@Component({\n selector: 'spine-auto-service-app-operations',\n standalone: true,\n imports: [CommonModule, DataGridComponent, DataGridCellDirective, TagComponent],\n templateUrl: './auto-service-app-operations.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-app-operations.component.scss'],\n})\nexport class AutoServiceAppOperationsComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly messages = inject(SPINE_MESSAGES);\n @Input() clientId = '';\n @Input() appId = '';\n operations: OperationRow[] = [];\n loading = false;\n constructor(private service: AutoServiceService) {}\n\n readonly rowId = (op: OperationRow) => op.operation_id;\n readonly columns = computed<GridColumn<OperationRow>[]>(() => [\n { key: 'identifier', title: this.text.colIdentifier, value: (op) => op.identifier, sortable: true },\n { key: 'method', title: this.text.colMethod, value: (op) => op.method, sortable: true },\n { key: 'level', title: this.text.colLevel, value: (op) => op.level, sortable: true },\n { key: 'description', title: this.text.colDescription, value: (op) => op.description || '—' },\n { key: 'allowed_groups', title: this.text.colAllowedGroups, value: (op) => (op.allowed_groups?.length ? this.groupCount(op) : '—') },\n ]);\n\n /** \"2 grupos\": a etiqueta da coluna de grupos com acesso (mesma do painel do Argos). */\n groupCount(op: OperationRow): string {\n return pluralMessage(this.text.groupCount, op.allowed_groups?.length ?? 0, this.messages.meta.locale);\n }\n\n ngOnChanges(changes: SimpleChanges) { if (changes['appId']) { this.load(); } }\n\n async load() {\n if (!this.appId) { this.operations = []; return; }\n this.loading = true;\n try { const res = await this.service.getAppOperations(this.clientId, this.appId); this.operations = res.operations; }\n finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n /** Mesma cor de nível do drawer de permissões e do painel do Argos (`levelTagColor`). */\n levelTagColor(level: string | null | undefined): TagColor {\n return levelTagColor(level);\n }\n}\n","<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"operations\"\n [rowId]=\"rowId\"\n [caption]=\"text.operationsCaption\"\n [loading]=\"loading\"\n [emptyMessage]=\"text.noOperations\"\n>\n <ng-template hmCell=\"identifier\" let-op>\n <code>{{ op.identifier }}</code>\n </ng-template>\n\n <ng-template hmCell=\"level\" let-op>\n <hm-tag [name]=\"op.level\" [color]=\"levelTagColor(op.level)\" />\n </ng-template>\n\n <ng-template hmCell=\"allowed_groups\" let-op>\n <hm-tag *ngIf=\"op.allowed_groups?.length; else noGroups\" [name]=\"groupCount(op)\" color=\"info\" />\n <ng-template #noGroups><span class=\"muted\">—</span></ng-template>\n </ng-template>\n</hm-data-grid>\n","import {\n Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AbstractControl, FormControl, ReactiveFormsModule, ValidationErrors, ValidatorFn, Validators } from '@angular/forms';\nimport {\n AlertComponent, ButtonComponent, CheckboxComponent, CopyButtonComponent, DatePickerComponent, InputComponent, ModalComponent,\n TagComponent, TextareaComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { autoServiceErrorText } from '../../../../../auto-service-errors';\nimport { AutoServiceService } from '../../../../../auto-service.service';\nimport { freeAccessText, levelTagColor, requiresPermission } from '../operation-level';\n\n/** Teto de validade aceito pelo servidor (`APP_TOKEN_MAX_DAYS` do argos-admin). */\nexport const APP_TOKEN_MAX_DAYS = 365;\n/** Validade sugerida ao abrir o modal. */\nexport const APP_TOKEN_DEFAULT_DAYS = 90;\n/** Limite do nome no formulário. */\nexport const APP_TOKEN_NAME_MAX = 100;\n\n/** Data LOCAL em AAAA-MM-DD (`toISOString()` daria a data em UTC: em UTC-3, depois das 21h já é amanhã). */\nexport function localIsoDate(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\n/** Hoje + `days` dias, em data local (`setDate` cuida da virada de mês e ano). */\nexport function addLocalDays(base: Date, days: number): string {\n const date = new Date(base.getFullYear(), base.getMonth(), base.getDate());\n date.setDate(date.getDate() + days);\n return localIsoDate(date);\n}\n\n/**\n * Meia-noite LOCAL do dia escolhido (AAAA-MM-DD), em ISO com fuso. Mandar só a data fazia o servidor ler meia-noite\n * UTC (em UTC-3 \"amanhã\" podia já ter passado). Meia-noite local de amanhã é sempre futura e a de hoje + 365 nunca\n * passa de agora + 365 dias.\n */\nexport function localDayStartIso(value: string): string {\n const [y, m, d] = value.split('-').map(Number);\n return new Date(y, m - 1, d).toISOString();\n}\n\n/** Intervalo [min, max] comparando AAAA-MM-DD (ordem do texto = ordem das datas). */\nfunction dateRangeValidator(min: string, max: string): ValidatorFn {\n return (control: AbstractControl<string | null>): ValidationErrors | null => {\n const value = control.value;\n if (!value) return null;\n if (value < min) return { minDate: { min, actual: value } };\n if (value > max) return { maxDate: { max, actual: value } };\n return null;\n };\n}\n\ninterface OperationRow {\n operation_id: string;\n identifier: string;\n method: string;\n level: string;\n description?: string;\n /** Vazio = dá para escolher (protected/private). Senão, por que o token não precisa dela (public): caixa desmarcada e desabilitada. */\n free: string;\n control: FormControl<boolean>;\n}\n\n/**\n * \"Novo token\" de uma aplicação: nome, descrição, validade (de amanhã até 365 dias) e as operações liberadas ao token.\n * Nada vem marcado: o token não tem login, então `protected` e `private` (e `optional`) só valem se marcadas aqui; as\n * `public` aparecem desmarcadas e desabilitadas (não precisam de token) e nunca vão em `operation_ids`. Criado, o valor aparece uma única vez, com copiar; fechar o descarta.\n * Mirror de admin/ui/.../apps/tabs/app-tokens/modals/token-create (argos-admin), escopado em `/auto-service/:clientId`.\n */\n@Component({\n selector: 'spine-auto-service-token-create',\n standalone: true,\n imports: [\n CommonModule, ReactiveFormsModule, AlertComponent, ButtonComponent, CheckboxComponent, CopyButtonComponent, DatePickerComponent,\n InputComponent, ModalComponent, TagComponent, TextareaComponent,\n ],\n templateUrl: './auto-service-token-create.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-token-create.component.scss'],\n})\nexport class AutoServiceTokenCreateComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly service = inject(AutoServiceService);\n protected readonly levelTagColor = levelTagColor;\n protected readonly nameMax = APP_TOKEN_NAME_MAX;\n\n @Input() clientId = '';\n @Input() appId = '';\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n /** Token criado (a lista recarrega na hora, sem esperar o modal fechar). */\n @Output() created = new EventEmitter<void>();\n\n minDate = addLocalDays(new Date(), 1);\n maxDate = addLocalDays(new Date(), APP_TOKEN_MAX_DAYS);\n\n readonly name = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.maxLength(APP_TOKEN_NAME_MAX)] });\n readonly description = new FormControl('', { nonNullable: true });\n readonly expiresAt = new FormControl<string | null>(null, { validators: [Validators.required] });\n\n rows: OperationRow[] = [];\n loading = false;\n saving = false;\n saveError: string | null = null;\n /** Valor recém-criado: aparece uma única vez, só enquanto o modal está aberto. */\n createdToken: { name: string; token: string } | null = null;\n\n /** Mensagens de validação da data no idioma ativo (o `hm-date-picker` mostra pelo `messages`). */\n get dateMessages(): Record<string, string> {\n return { minDate: this.text.tokenExpiresInvalid, maxDate: this.text.tokenExpiresInvalid };\n }\n\n get canSave(): boolean {\n return !this.saving && !this.loading && this.name.valid && !!this.name.value.trim() && this.expiresAt.valid;\n }\n\n get hasFreeRows(): boolean { return this.rows.some((r) => !!r.free); }\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) void this.reset(); }\n\n /** Abre limpo: datas recalculadas (o modal pode ficar montado de um dia para o outro) e operações relidas. */\n async reset() {\n this.minDate = addLocalDays(new Date(), 1);\n this.maxDate = addLocalDays(new Date(), APP_TOKEN_MAX_DAYS);\n this.expiresAt.setValidators([Validators.required, dateRangeValidator(this.minDate, this.maxDate)]);\n this.name.reset('');\n this.description.reset('');\n this.expiresAt.reset(addLocalDays(new Date(), APP_TOKEN_DEFAULT_DAYS));\n this.createdToken = null;\n this.saveError = null;\n this.rows = [];\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const res = await this.service.getAppOperations(this.clientId, this.appId);\n this.rows = (res.operations ?? []).map((op: any) => ({\n operation_id: op.operation_id,\n identifier: op.identifier,\n method: op.method,\n level: op.level,\n description: op.description,\n free: freeAccessText(op.level, this.text, 'token'),\n control: requiresPermission(op.level, 'token')\n ? new FormControl(false, { nonNullable: true })\n : new FormControl({ value: false, disabled: true }, { nonNullable: true }),\n }));\n } catch (err) {\n this.saveError = autoServiceErrorText(err, this.text, this.text.tokenSaveError);\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n onModalOpenChange(value: boolean) {\n this.open = value;\n if (!value) this.createdToken = null;\n this.openChange.emit(value);\n }\n\n close() { this.onModalOpenChange(false); }\n\n async save() {\n this.name.markAsTouched();\n this.expiresAt.markAsTouched();\n if (!this.canSave || !this.expiresAt.value) return;\n this.saving = true;\n this.saveError = null;\n this.cdr.markForCheck();\n try {\n const name = this.name.value.trim();\n const description = this.description.value.trim();\n const res = await this.service.createAppToken(this.clientId, this.appId, {\n name,\n ...(description ? { description } : {}),\n expires_at: localDayStartIso(this.expiresAt.value),\n // Só as escolhidas (protected/private): public não vira permissão (o servidor recusa com operation_public).\n operation_ids: this.rows.filter((r) => !r.free && r.control.value).map((r) => r.operation_id),\n });\n this.createdToken = { name: res.name ?? name, token: res.token };\n this.created.emit();\n } catch (err) {\n this.saveError = autoServiceErrorText(err, this.text, this.text.tokenSaveError);\n } finally {\n this.saving = false;\n this.cdr.markForCheck();\n }\n }\n\n createdHeading(name: string): string { return formatMessage(this.text.tokenCreatedHeading, { name }); }\n valueLabel(name: string): string { return formatMessage(this.text.tokenValueLabel, { name }); }\n}\n","<!-- Depois de criar, o modal só mostra o valor (uma vez); fechar (Concluir, Esc ou ✕) o descarta. -->\n<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\"\n [heading]=\"createdToken ? createdHeading(createdToken.name) : text.newToken\" size=\"large\" (closed)=\"close()\">\n <div class=\"form-stack\" *ngIf=\"createdToken as created; else formTpl\">\n <hm-alert variant=\"warning\" [heading]=\"text.tokenCreatedWarning\">{{ text.tokenCreatedNote }}</hm-alert>\n <div class=\"as-secret\">\n <span class=\"as-secret__label\" id=\"as-created-token-label\">{{ valueLabel(created.name) }}</span>\n <div class=\"as-secret__row\">\n <code class=\"as-secret__value\" aria-labelledby=\"as-created-token-label\">{{ created.token }}</code>\n <hm-copy-button variant=\"text\" [value]=\"created.token\" [label]=\"text.copyToken\" [copiedLabel]=\"text.tokenCopied\" />\n </div>\n </div>\n </div>\n\n <ng-template #formTpl>\n <div class=\"form-stack\">\n <hm-alert *ngIf=\"saveError\" variant=\"error\">{{ saveError }}</hm-alert>\n <hm-input [formControl]=\"name\" [label]=\"text.tokenName\" [maxLength]=\"nameMax\" />\n <hm-textarea [formControl]=\"description\" [label]=\"text.tokenDescription\" [rows]=\"2\" />\n <hm-date-picker [formControl]=\"expiresAt\" [label]=\"text.tokenExpiresAt\" [min]=\"minDate\" [max]=\"maxDate\"\n [hint]=\"text.tokenExpiresHint\" [messages]=\"dateMessages\" />\n\n <fieldset class=\"token-ops\">\n <legend class=\"token-ops__legend\">{{ text.tokenOperations }}</legend>\n <p class=\"token-ops__note muted\" *ngIf=\"hasFreeRows || rows.length\">{{ text.tokenOperationsNote }}</p>\n <p class=\"token-ops__empty muted\" *ngIf=\"loading\">{{ text.loading }}</p>\n <p class=\"token-ops__empty muted\" *ngIf=\"!loading && rows.length === 0\">{{ text.noOperations }}</p>\n <div class=\"token-ops__row\" *ngFor=\"let row of rows\">\n <hm-checkbox [formControl]=\"row.control\" [label]=\"row.identifier\" />\n <div class=\"token-ops__meta\">\n <hm-tag [name]=\"row.method\" />\n <hm-tag [name]=\"row.level\" [color]=\"levelTagColor(row.level)\" />\n <span class=\"token-ops__free\" *ngIf=\"row.free\">{{ row.free }}</span>\n <span class=\"token-ops__desc muted\" *ngIf=\"row.description\">{{ row.description }}</span>\n </div>\n </div>\n </fieldset>\n </div>\n </ng-template>\n\n <ng-container footer>\n <ng-container *ngIf=\"!createdToken\">\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [disabled]=\"!canSave\" [loading]=\"saving\" (clicked)=\"save()\">{{ text.createToken }}</hm-button>\n </ng-container>\n <hm-button *ngIf=\"createdToken\" (clicked)=\"close()\">{{ text.rotatedSecretDone }}</hm-button>\n </ng-container>\n</hm-modal>\n","import {\n Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, computed, ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n ButtonComponent, DataGridActionTriggered, DataGridCellDirective, DataGridComponent, DataGridRowAction, GridColumn,\n HermesToastService, TagColor, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { autoServiceErrorText } from '../../../../auto-service-errors';\nimport { AutoServiceAppToken, AutoServiceService } from '../../../../auto-service.service';\nimport { AutoServiceConsumerPermissionsComponent } from '../app-access/modals/consumer-permissions/auto-service-consumer-permissions.component';\nimport { AutoServiceTokenCreateComponent } from './token-create/auto-service-token-create.component';\n\ntype TokenStatus = 'active' | 'expired' | 'revoked';\n\n/**\n * Aba Tokens da aplicação: os tokens de API (`x-api-token`) com situação, validade e último uso; \"Novo token\" (modal com\n * as operações liberadas), o botão \"Gerenciar operações\" na linha (o token também é um consumer) e, no menu, \"Revogar\" (com\n * confirmação; o token para de valer na hora e fica na lista como revogado).\n * Mirror de admin/ui/.../apps/tabs/app-tokens (argos-admin), escopado em `/auto-service/:clientId`.\n */\n@Component({\n selector: 'spine-auto-service-app-tokens',\n standalone: true,\n imports: [\n CommonModule, ButtonComponent, DataGridComponent, DataGridCellDirective, TagComponent,\n AutoServiceTokenCreateComponent, AutoServiceConsumerPermissionsComponent,\n ],\n templateUrl: './auto-service-app-tokens.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-app-tokens.component.scss'],\n})\nexport class AutoServiceAppTokensComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n private readonly catalog = inject(SPINE_MESSAGES);\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly service = inject(AutoServiceService);\n private readonly toast = inject(HermesToastService);\n @Input() clientId = '';\n @Input() appId = '';\n tokens: AutoServiceAppToken[] = [];\n loading = false;\n showCreate = false;\n showPermissions = false;\n /** Token aberto em \"Gerenciar operações\", no formato que o painel de permissões espera (o nome no lugar do grupo). */\n permissionsConsumer: { consumer_id: string; group_name: string } | null = null;\n\n readonly rowId = (tk: AutoServiceAppToken) => tk.id;\n readonly columns = computed<GridColumn<AutoServiceAppToken>[]>(() => [\n { key: 'name', title: this.text.colName, value: (tk) => tk.name, sortable: true, searchable: true },\n { key: 'prefix', title: this.text.colTokenPrefix, value: (tk) => tk.token_prefix ?? '' },\n { key: 'status', title: this.text.colStatus, value: (tk) => this.statusLabel(this.status(tk)), sortable: true },\n { key: 'expires_at', title: this.text.colExpiresAt, value: (tk) => tk.expires_at ?? '', sortable: true },\n { key: 'last_used_at', title: this.text.colLastUsed, value: (tk) => tk.last_used_at ?? '', sortable: true },\n // Como no painel do Argos: \"Gerenciar operações\" é um botão na linha (token revogado mostra \"—\").\n { key: 'operations', title: this.text.colOperations, value: () => '' },\n ]);\n // Revogado não tem mais o que fazer: a linha fica sem o menu.\n readonly rowActions = computed<DataGridRowAction<AutoServiceAppToken>[]>(() => [\n {\n id: 'revoke', icon: 'ban', label: this.text.revokeToken, danger: true,\n available: (tk) => !tk.revoked_at,\n confirm: (tk) => ({\n heading: this.text.confirmRevokeTokenHeading,\n message: formatMessage(this.text.confirmRevokeToken, { name: tk.name }),\n confirmLabel: this.text.revokeToken,\n }),\n },\n ]);\n\n ngOnChanges(changes: SimpleChanges) { if (changes['appId'] || changes['clientId']) void this.load(); }\n\n async load() {\n const { clientId, appId } = this;\n if (!clientId || !appId) { this.tokens = []; return; }\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const res = await this.service.getAppTokens(clientId, appId);\n if (this.appId !== appId || this.clientId !== clientId) return;\n this.tokens = res.tokens ?? [];\n } catch (err) {\n this.tokens = [];\n this.toast.error(autoServiceErrorText(err, this.text, this.text.tokensLoadError));\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n status(tk: AutoServiceAppToken, now = Date.now()): TokenStatus {\n if (tk.revoked_at) return 'revoked';\n if (new Date(tk.expires_at).getTime() <= now) return 'expired';\n return 'active';\n }\n\n statusLabel(status: TokenStatus): string {\n if (status === 'revoked') return this.text.tokenRevoked;\n if (status === 'expired') return this.text.tokenExpired;\n return this.text.active;\n }\n\n /** Ativo em verde, expirado em amarelo, revogado neutro; o texto do selo diz qual (a cor só reforça). */\n statusColor(status: TokenStatus): TagColor {\n if (status === 'revoked') return 'neutral';\n if (status === 'expired') return 'warning';\n return 'success';\n }\n\n formatDate(value: string | null | undefined): string {\n if (!value) return '';\n return new Intl.DateTimeFormat(this.catalog.meta.locale, { dateStyle: 'short', timeStyle: 'short' }).format(new Date(value));\n }\n\n openCreate() { this.showCreate = true; this.cdr.markForCheck(); }\n\n openPermissions(tk: AutoServiceAppToken) {\n this.permissionsConsumer = { consumer_id: tk.consumer_id, group_name: tk.name };\n this.showPermissions = true;\n this.cdr.markForCheck();\n }\n\n /** Já confirmado pelo `confirm` da ação na grade. Sucesso e falha viram toast. */\n async revoke(tk: AutoServiceAppToken) {\n if (tk.revoked_at) return;\n try {\n await this.service.revokeAppToken(this.clientId, this.appId, tk.id);\n this.toast.success(formatMessage(this.text.tokenRevokedDone, { name: tk.name }));\n } catch (err) {\n this.toast.error(autoServiceErrorText(err, this.text, this.text.tokenRevokeError));\n return;\n }\n await this.load();\n }\n\n onAction(e: DataGridActionTriggered<AutoServiceAppToken>): void {\n if (e.action === 'revoke') void this.revoke(e.row);\n }\n}\n","<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"tokens\"\n [rowId]=\"rowId\"\n [caption]=\"text.tokensCaption\"\n [loading]=\"loading\"\n [rowActions]=\"rowActions()\"\n [emptyMessage]=\"text.noTokens\"\n (actionTriggered)=\"onAction($event)\"\n>\n <hm-button dataGridActions icon=\"plus\" (clicked)=\"openCreate()\">{{ text.newToken }}</hm-button>\n <ng-template hmCell=\"prefix\" let-tk>\n <code *ngIf=\"tk.token_prefix; else noPrefix\">{{ tk.token_prefix }}…</code>\n <ng-template #noPrefix>—</ng-template>\n </ng-template>\n <ng-template hmCell=\"status\" let-tk>\n <hm-tag [name]=\"statusLabel(status(tk))\" [color]=\"statusColor(status(tk))\" />\n </ng-template>\n <ng-template hmCell=\"expires_at\" let-tk>{{ formatDate(tk.expires_at) || '—' }}</ng-template>\n <ng-template hmCell=\"last_used_at\" let-tk>{{ tk.last_used_at ? formatDate(tk.last_used_at) : text.neverUsed }}</ng-template>\n <ng-template hmCell=\"operations\" let-tk>\n <hm-button *ngIf=\"!tk.revoked_at; else revokedOps\" emphasis=\"minimal\" icon=\"shield\" (clicked)=\"openPermissions(tk)\">{{ text.manageOperations }}</hm-button>\n <ng-template #revokedOps><span class=\"muted\">—</span></ng-template>\n </ng-template>\n</hm-data-grid>\n\n<spine-auto-service-token-create [clientId]=\"clientId\" [appId]=\"appId\" [open]=\"showCreate\"\n (openChange)=\"showCreate = $event\" (created)=\"load()\">\n</spine-auto-service-token-create>\n\n<spine-auto-service-consumer-permissions *ngIf=\"permissionsConsumer as consumer\" [clientId]=\"clientId\" [appId]=\"appId\"\n [consumer]=\"consumer\" mode=\"token\" [open]=\"showPermissions\" (openChange)=\"showPermissions = $event\">\n</spine-auto-service-consumer-permissions>\n","import { Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n AlertComponent, ButtonComponent, CardComponent, ComboboxComponent, ComboboxOption, CopyButtonComponent, HermesDialogService,\n HermesToastService, ModalComponent, TabComponent, TabContentDirective, TabsComponent, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AutoServiceDeleteFeedback } from '../../auto-service-delete';\nimport { AutoServiceApp, AutoServiceService } from '../../auto-service.service';\nimport { AutoServiceAppsModalComponent } from './modals/apps-modal/auto-service-apps-modal.component';\nimport { AutoServiceAppAccessComponent } from './tabs/app-access/auto-service-app-access.component';\nimport { AutoServiceAppOperationsComponent } from './tabs/app-operations/auto-service-app-operations.component';\nimport { AutoServiceAppTokensComponent } from './tabs/app-tokens/auto-service-app-tokens.component';\n\ntype Tab = 'operations' | 'access' | 'tokens';\n\n/**\n * Aplicações (client_credentials) do projeto do client: Cadastrar e um cartão com o seletor das aplicações e Consultar.\n * A aplicação consultada abre embaixo: o resumo com Editar, Ativar/Desativar, Gerar novo segredo e Excluir, e as abas\n * Operações, Acessos e Tokens. Mesmo molde da tela Grupos.\n */\n@Component({\n selector: 'spine-auto-service-apps',\n standalone: true,\n imports: [\n CommonModule, AlertComponent, ButtonComponent, CardComponent, ComboboxComponent, CopyButtonComponent, ModalComponent, TabsComponent, TabComponent, TabContentDirective, TagComponent,\n AutoServiceAppsModalComponent, AutoServiceAppOperationsComponent, AutoServiceAppAccessComponent, AutoServiceAppTokensComponent,\n ],\n templateUrl: './auto-service-apps.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service-apps.component.scss'],\n})\nexport class AutoServiceAppsComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly dialogs = inject(HermesDialogService);\n private readonly deletion = inject(AutoServiceDeleteFeedback);\n private readonly toast = inject(HermesToastService);\n private readonly service = inject(AutoServiceService);\n @Input() clientId = '';\n apps: AutoServiceApp[] = [];\n loading = false;\n /** Aplicação escolhida no seletor (só abre ao Consultar). */\n selectedAppId = '';\n /** Aplicação aberta (resumo + abas embaixo do seletor). */\n app: AutoServiceApp | null = null;\n modalApp: AutoServiceApp | null = null;\n showAppModal = false;\n activeTab: Tab = 'operations';\n newSecret: string | null = null;\n /** Segredo gerado por \"Gerar novo segredo\", mostrado uma vez na janela até \"Concluir\". */\n rotatedSecret: { name: string; secret: string } | null = null;\n rotatingSecret = false;\n\n /** Opções do seletor, recalculadas na carga (o `hm-combobox` recebe sempre o mesmo array). */\n appComboOptions: ComboboxOption[] = [];\n\n // Trocar de client fecha a aplicação aberta e esconde o segredo recém-criado: ele é de uma aplicação do client anterior.\n ngOnChanges(changes: SimpleChanges) {\n if (changes['clientId']) {\n this.app = null; this.selectedAppId = ''; this.apps = []; this.appComboOptions = []; this.newSecret = null; this.rotatedSecret = null;\n void this.load();\n }\n }\n\n async load() {\n const clientId = this.clientId;\n if (!clientId) { this.apps = []; this.appComboOptions = []; return; }\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const res = await this.service.getApps(clientId);\n if (this.clientId !== clientId) return;\n this.apps = res.apps ?? [];\n this.appComboOptions = this.apps.map((a) => ({ value: a.id, label: a.name ?? a.id }));\n // A aplicação aberta acompanha o que o servidor devolveu (nome/situação novos) ou fecha se sumiu.\n if (this.app) this.app = this.apps.find((a) => a.id === this.app!.id) ?? null;\n if (this.selectedAppId && !this.apps.some((a) => a.id === this.selectedAppId)) this.selectedAppId = '';\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n /** Consultar: abre a aplicação escolhida no seletor. */\n searchApp() {\n const a = this.apps.find((x) => x.id === this.selectedAppId);\n if (a) this.openApp(a);\n }\n\n /** Abre a aplicação embaixo do seletor; outra aplicação volta para a aba Operações. */\n openApp(a: AutoServiceApp) {\n if (this.app?.id !== a.id) this.activeTab = 'operations';\n this.app = a;\n this.selectedAppId = a.id;\n this.cdr.markForCheck();\n }\n\n setTab(tab: Tab) { this.activeTab = tab; }\n openCreate() { this.modalApp = null; this.showAppModal = true; this.cdr.markForCheck(); }\n openEdit(a: AutoServiceApp | null = this.app) { if (!a) return; this.modalApp = a; this.showAppModal = true; this.cdr.markForCheck(); }\n\n async onAppSaved(secret?: string) {\n if (secret) this.newSecret = secret;\n await this.load();\n this.cdr.markForCheck();\n }\n\n async toggleEnabled(a: AutoServiceApp | null = this.app) {\n if (!a) return;\n await this.service.updateApp(this.clientId, a.id, { enabled: !a.enabled });\n await this.load();\n }\n\n /**\n * \"Gerar novo segredo\": confirmação (o atual para de valer na hora), POST e o segredo novo numa janela,\n * mostrado uma única vez. Falha vira toast (404: aplicação de outro client; 403: client que a pessoa não\n * administra; senão o `detail` do servidor ou a mensagem genérica).\n */\n async rotateSecret(a: AutoServiceApp | null = this.app) {\n if (!a || this.rotatingSecret) return;\n const ok = await this.dialogs.confirm({\n heading: this.text.confirmRotateSecretHeading,\n message: this.text.confirmRotateSecret,\n confirmLabel: this.text.rotateSecret,\n danger: true,\n });\n if (!ok) return;\n this.rotatingSecret = true;\n this.cdr.markForCheck();\n try {\n const res = await this.service.rotateAppSecret(this.clientId, a.id);\n this.rotatedSecret = { name: a.name ?? a.id, secret: res.secret };\n } catch (err) {\n this.toast.error(this.rotateErrorText(err));\n } finally {\n this.rotatingSecret = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Fecha a janela do segredo: depois dela não há como ver o segredo de novo. */\n closeRotatedSecret() { this.rotatedSecret = null; this.cdr.markForCheck(); }\n\n rotatedSecretHeading(name: string): string { return formatMessage(this.text.rotatedSecretHeading, { name }); }\n rotatedSecretLabel(name: string): string { return formatMessage(this.text.rotatedSecretLabel, { name }); }\n\n private rotateErrorText(err: unknown): string {\n if (err instanceof HttpErrorResponse) {\n if (err.status === 404) return this.text.rotateSecretNotFound;\n if (err.status === 403) return this.text.rotateSecretForbidden;\n const detail = err.error?.detail;\n if (typeof detail === 'string' && detail) return detail;\n }\n return this.text.rotateSecretError;\n }\n\n /** Botão Excluir do resumo: pede confirmação e só então exclui. */\n async deleteApp(a: AutoServiceApp | null = this.app) {\n if (!a) return;\n const ok = await this.dialogs.confirm({\n heading: this.text.confirmDeleteAppHeading,\n message: formatMessage(this.text.confirmDeleteApp, { name: a.name ?? a.id }),\n confirmLabel: this.text.delete,\n danger: true,\n });\n if (ok) await this.removeApp(a);\n }\n\n /** DELETE com toast de sucesso/erro; a aplicação aberta fecha e o segredo recém-criado some. */\n async removeApp(a: AutoServiceApp) {\n if (!(await this.deletion.run(() => this.service.deleteApp(this.clientId, a.id)))) return;\n if (this.app?.id === a.id) { this.app = null; this.selectedAppId = ''; }\n this.newSecret = null;\n await this.load();\n }\n}\n","<div class=\"as-stack\">\n <div class=\"as-actions\">\n <hm-button icon=\"plus\" (clicked)=\"openCreate()\">{{ text.register }}</hm-button>\n </div>\n\n <hm-alert *ngIf=\"newSecret\" variant=\"success\" [closable]=\"true\" (closed)=\"newSecret = null\">\n {{ text.secretCreated }} <strong>{{ newSecret }}</strong>\n </hm-alert>\n\n <!-- Escolher a aplicação no seletor e Consultar abre o resumo (com as ações) e as abas embaixo. -->\n <hm-card>\n <div class=\"as-field-row\">\n <hm-combobox [label]=\"text.pickApp\" [options]=\"appComboOptions\" [value]=\"selectedAppId\"\n (valueChange)=\"selectedAppId = $event\" [disabled]=\"loading\">\n </hm-combobox>\n <hm-button [disabled]=\"!selectedAppId\" (clicked)=\"searchApp()\" icon=\"search\">{{ text.search }}</hm-button>\n </div>\n <p class=\"as-empty muted\" *ngIf=\"!loading && apps.length === 0\">{{ text.noApps }}</p>\n </hm-card>\n\n <ng-container *ngIf=\"app as a\">\n <hm-card>\n <div class=\"as-summary\">\n <div class=\"as-summary__info\">\n <p class=\"as-summary__title app-title\">\n {{ a.name }}\n <hm-tag [name]=\"a.enabled ? text.active : text.inactive\" [color]=\"a.enabled ? 'success' : 'danger'\" />\n </p>\n <p class=\"as-summary__detail\">{{ a.allowed_grants?.join(', ') }}</p>\n </div>\n <div class=\"as-actions\">\n <hm-button emphasis=\"medium\" icon=\"pencil\" (clicked)=\"openEdit(a)\">{{ text.edit }}</hm-button>\n <hm-button emphasis=\"medium\" (clicked)=\"toggleEnabled(a)\">{{ a.enabled ? text.disable : text.enable }}</hm-button>\n <hm-button emphasis=\"medium\" icon=\"key\" [loading]=\"rotatingSecret\" (clicked)=\"rotateSecret(a)\">{{ text.rotateSecret }}</hm-button>\n <hm-button intent=\"danger\" emphasis=\"medium\" icon=\"trash\" (clicked)=\"deleteApp(a)\">{{ text.delete }}</hm-button>\n </div>\n </div>\n </hm-card>\n\n <!-- Conteúdo de cada aba é preguiçoso (*hmTabContent): só busca na API quando a aba é aberta. -->\n <hm-tabs [label]=\"text.appSections\" [active]=\"activeTab\" (activeChange)=\"setTab($any($event))\">\n <hm-tab id=\"operations\" [label]=\"text.tabOperations\">\n <spine-auto-service-app-operations *hmTabContent [clientId]=\"clientId\" [appId]=\"a.id\"></spine-auto-service-app-operations>\n </hm-tab>\n <hm-tab id=\"access\" [label]=\"text.tabAccesses\">\n <spine-auto-service-app-access *hmTabContent [clientId]=\"clientId\" [appId]=\"a.id\"></spine-auto-service-app-access>\n </hm-tab>\n <hm-tab id=\"tokens\" [label]=\"text.tabTokens\">\n <spine-auto-service-app-tokens *hmTabContent [clientId]=\"clientId\" [appId]=\"a.id\"></spine-auto-service-app-tokens>\n </hm-tab>\n </hm-tabs>\n </ng-container>\n</div>\n\n<!-- Segredo novo (\"Gerar novo segredo\"): aparece uma vez; fechar (Concluir, Esc ou ✕) o descarta. -->\n<hm-modal\n [open]=\"!!rotatedSecret\"\n (openChange)=\"$event || closeRotatedSecret()\"\n [heading]=\"rotatedSecret ? rotatedSecretHeading(rotatedSecret.name) : ''\"\n (closed)=\"closeRotatedSecret()\">\n <div class=\"as-stack\" *ngIf=\"rotatedSecret as rotated\">\n <hm-alert variant=\"warning\" [heading]=\"text.rotatedSecretWarning\">{{ text.rotatedSecretNote }}</hm-alert>\n <div class=\"as-secret\">\n <span class=\"as-secret__label\" id=\"as-rotated-secret-label\">{{ rotatedSecretLabel(rotated.name) }}</span>\n <div class=\"as-secret__row\">\n <code class=\"as-secret__value\" aria-labelledby=\"as-rotated-secret-label\">{{ rotated.secret }}</code>\n <hm-copy-button variant=\"text\" [value]=\"rotated.secret\" [label]=\"text.copySecret\" [copiedLabel]=\"text.secretCopied\" />\n </div>\n </div>\n </div>\n <ng-container footer>\n <hm-button (clicked)=\"closeRotatedSecret()\">{{ text.rotatedSecretDone }}</hm-button>\n </ng-container>\n</hm-modal>\n\n<spine-auto-service-apps-modal\n [app]=\"modalApp\"\n [clientId]=\"clientId\"\n [open]=\"showAppModal\"\n (openChange)=\"showAppModal = $event\"\n (saved)=\"onAppSaved($event)\">\n</spine-auto-service-apps-modal>\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from './client-picker/auto-service-client-picker.component';\nimport { AutoServiceAppsComponent } from './tabs/auto-service-apps/auto-service-apps.component';\n\n/**\n * Página \"Aplicações\" do auto-serviço: o seletor de client e as aplicações dele. A auditoria tem página\n * própria no menu Administração (`AUTO_SERVICE_SCREENS.audit`) — a aba que existia aqui duplicava a tela.\n */\n@Component({\n selector: 'spine-auto-service',\n standalone: true,\n imports: [CommonModule, AutoServiceClientPickerComponent, AutoServiceAppsComponent],\n templateUrl: './auto-service.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./auto-service.component.scss'],\n})\nexport class AutoServiceComponent {\n client: AutoServiceClient | null = null;\n\n onClientChange(c: AutoServiceClient | null) { this.client = c; }\n}\n","<!-- Título e descrição da tela vêm da barra da página (nome + description do router). -->\n<div class=\"as-stack\">\n <spine-auto-service-client-picker (clientChange)=\"onClientChange($event)\"></spine-auto-service-client-picker>\n <spine-auto-service-apps *ngIf=\"client as c\" [clientId]=\"c.id\"></spine-auto-service-apps>\n</div>\n"],"names":["i1.AutoServiceService","i2","i1"],"mappings":";;;;;;;;;;;;;;MAea,6BAA6B,CAAA;AAexC,IAAA,WAAA,CAAoB,OAA2B,EAAA;QAA3B,IAAA,CAAA,OAAO,GAAP,OAAO;AAdR,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;;AAE3C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACvC,IAAA,CAAA,GAAG,GAAQ,IAAI;QACf,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,IAAI,GAAG,KAAK;AACX,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAW;AACxC,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,YAAY,EAAsB;QAE/C,IAAA,CAAA,IAAI,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;AACpF,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,WAAW,CAAC,oBAAoB,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACrE,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAE/D,IAAA,CAAA,MAAM,GAAG,KAAK;IACoC;AAClD,IAAA,IAAI,MAAM,GAAA,EAAc,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAE/C,IAAA,WAAW,CAAC,OAAsB,EAAA,EAAI,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,SAAS,EAAE;AAAE,IAAA,CAAC,CAAC;IAE9F,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;QACzC;aAAO;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC;AAC1C,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC7B;IACF;IAEA,iBAAiB,CAAC,KAAc,EAAA,EAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,KAAK,GAAA,EAAK,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;AAEzC,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,QAAA,IAAI;AACF,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACtF,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;AAChI,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACnB;iBAAO;gBACL,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;gBAClG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B;YACA,IAAI,CAAC,KAAK,EAAE;QACd;gBAAU;AAAE,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAAE;IAC5D;+GAhDW,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,QAAA,EAAA,UAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECf1C,yrBAYA,EAAA,MAAA,EAAA,CAAA,0EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDFY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,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,cAAc,uSAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAKpG,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBARzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,+BAA+B,cAC7B,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,CAAC,EAAA,eAAA,EAE/F,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,yrBAAA,EAAA,MAAA,EAAA,CAAA,0EAAA,CAAA,EAAA;;sBAO7C;;sBACA;;sBACA;;sBACA;;sBACA;;;METU,kCAAkC,CAAA;AAY7C,IAAA,WAAA,CAAoB,OAA2B,EAAA;QAA3B,IAAA,CAAA,OAAO,GAAP,OAAO;AAXR,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;;AAE3C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACvC,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,KAAK,GAAG,EAAE;QACV,IAAA,CAAA,eAAe,GAAU,EAAE;QAC3B,IAAA,CAAA,IAAI,GAAG,KAAK;AACX,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAW;AACxC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;QAC5C,IAAA,CAAA,OAAO,GAAG,EAAE;QACZ,IAAA,CAAA,MAAM,GAAG,KAAK;IACoC;AAElD,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,GAAG,CAAA,EAAG,CAAC,CAAC,IAAI,CAAA,EAAA,EAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA,CAAA,CAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAClH;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA,EAAI,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;AAAE,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AAAE,IAAA,CAAC,CAAC;IAC/F,iBAAiB,CAAC,KAAc,EAAA,EAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpF,KAAK,GAAA,EAAK,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;AAEzC,IAAA,MAAM,IAAI,GAAA;QACR,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,QAAA,IAAI;AAAE,YAAA,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,KAAK,EAAE;QAAE;gBAChH;AAAE,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAAE;IAC1D;+GA3BW,kCAAkC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlC,kCAAkC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECd/C,6gBAQA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDCY,YAAY,+BAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,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,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAK/D,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAR9C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oCAAoC,EAAA,UAAA,EAClC,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,CAAC,EAAA,eAAA,EAE1D,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,6gBAAA,EAAA;;sBAO7C;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;;AEXH;SACgB,kBAAkB,CAAC,KAAgC,EAAE,OAAuB,OAAO,EAAA;IACjG,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,KAAK,QAAQ;IAC/C,OAAO,KAAK,KAAK,WAAW;AAC9B;AAEA;AACM,SAAU,cAAc,CAAC,KAAgC,EAAE,IAAkC,EAAE,OAAuB,OAAO,EAAA;AACjI,IAAA,IAAI,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC;AAAE,QAAA,OAAO,EAAE;IAC9C,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,aAAa;IAC/C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,oBAAoB;AACzD,IAAA,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC,UAAU;IACtE,OAAO,IAAI,CAAC,gBAAgB;AAC9B;AAEA;;;AAGG;AACG,SAAU,WAAW,CAAC,IAAoB,EAAA;IAC9C,OAAO,IAAI,KAAK,OAAO;AACzB;AAEA;;;AAGG;AACG,SAAU,aAAa,CAAC,KAAgC,EAAA;IAC5D,IAAI,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,SAAS;IACxC,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,MAAM;IACtC,IAAI,KAAK,KAAK,WAAW;AAAE,QAAA,OAAO,SAAS;AAC3C,IAAA,OAAO,SAAS;AAClB;;ACIA;;;;;AAKG;MAWU,uCAAuC,CAAA;AAUlD,IAAA,IAAa,IAAI,CAAC,KAAqB,EAAA,EAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,IAAI,IAAI,KAAqB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AAyDpD,IAAA,WAAA,CAAoB,OAA2B,EAAA;QAA3B,IAAA,CAAA,OAAO,GAAP,OAAO;AAnEV,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW;;AAElC,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAC7B,IAAA,CAAA,GAAG,GAAG,aAAa;AACrB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAC1C,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,KAAK,GAAG,EAAE;QACV,IAAA,CAAA,QAAQ,GAAQ,IAAI;QAGpB,IAAA,CAAA,IAAI,GAAG,KAAK;AACX,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAW;QAClD,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,MAAM,GAAG,KAAK;AACG,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAiB,OAAO,8EAAC;AAEjD,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAkB,EAAE,2EAAC;;AAElC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,EAAE,6EAAC;AACnB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,kFAAC;;AAErE,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,mFAAC;;AAErE,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,kFAAC;AACpD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,kFAAC;AACrD,QAAA,IAAA,CAAA,mBAAmB,GAAwB,IAAI,GAAG,EAAE;;AAG3C,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,iFAAC;QACpD,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAC3E,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAsB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,gFAAC;AACtH;AACoC;AAC3B,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAsB,MACpD,IAAI,CAAC,OAAO,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,mFACxG;AAED;AAC8G;QACrG,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAsB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEhG,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;AACnC,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAA6B;AAChD,YAAA,MAAM,IAAI,GAAG,CAAC,KAAsB,KAAI;AACtC,gBAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;AACrB,oBAAA,IAAI,CAAC,CAAC,QAAQ,EAAE;AACd,wBAAA,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;wBACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AAC3D,wBAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;AACb,4BAAA,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI;AAC5B,4BAAA,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;AAC1G,yBAAA,CAAC;AACF,wBAAA,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAClB;yBAAO;AACL,wBAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;AACb,4BAAA,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;4BACnG,WAAW,EAAE,CAAC,CAAC,WAAW;AAC3B,yBAAA,CAAC;oBACJ;gBACF;AACF,YAAA,CAAC;AACD,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACjB,YAAA,OAAO,GAAG;AACZ,QAAA,CAAC,+EAAC;IAEgD;AAElD,IAAA,IAAI,CAAC,IAAc,EAAA;QACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;IACnF;AAEQ,IAAA,UAAU,CAAC,IAAmB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC;YAClC,OAAO;AACL,gBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK;;AAE3C,gBAAA,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC1D,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACrD;QACH;QACA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE;AACrF,QAAA,MAAM,KAAK,GAAG,CAAA,EAAG,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAA,GAAA,EAAM,IAAI,CAAC,KAAK,CAAA,EAAG,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,EAAE,EAAE;QAC3I,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE;IACrE;;AAGA,IAAA,cAAc,CAAC,IAAY,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE;QAClB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA,EAAI,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,KAAK,EAAE;AAAE,IAAA,CAAC,CAAC;AAC1F,IAAA,KAAK,KAAK,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAE1D,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI;YACF,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AAC3C,gBAAA,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;AACxD,gBAAA,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;AACzE,aAAA,CAAC;AACF,YAAA,MAAM,UAAU,GAAU,MAAM,CAAC,UAAU,IAAI,EAAE;AACjD,YAAA,MAAM,WAAW,GAAU,QAAQ,CAAC,WAAW,IAAI,EAAE;YACrD,MAAM,IAAI,GAAoB,EAAE;AAChC,YAAA,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACvG,YAAA,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE;AACvB,gBAAA,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,YAAY,KAAK,EAAE,CAAC,YAAY,CAAC;AAC7E,gBAAA,MAAM,QAAQ,GAAa,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AAC3D,gBAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAG;gBAChC,IAAI,KAAK,GAAG,IAAI;gBAChB,IAAI,IAAI,GAAG,EAAE;AACb,gBAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,oBAAA,IAAI,GAAG,IAAI,GAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,GAAG,OAAO;oBAC5C,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;oBAC9D,IAAI,CAAC,MAAM,EAAE;;wBAEX,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAA,CAAG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;AACzE,wBAAA,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;oBACpB;AACA,oBAAA,KAAK,GAAG,MAAM,CAAC,QAAQ;gBACzB;gBACA,KAAK,CAAC,IAAI,CAAC;oBACT,GAAG,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU;oBAC5F,YAAY,EAAE,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW;oBAC9F,YAAY,EAAE,IAAI,EAAE,aAAa;AACjC,oBAAA,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;AAC1D,iBAAA,CAAC;YACJ;AACA,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,YAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACnG,YAAA,IAAI,CAAC,mBAAmB,GAAG,QAAQ;YACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AAC/B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB;gBAAU;AAAE,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAAE;IAC7D;AAEA;;;AAGG;AACH,IAAA,aAAa,CAAC,OAAuC,EAAA;AACnD,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,IAAG;AAChC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;AAC/C,gBAAA,IAAI,CAAC,IAAI;oBAAE;gBACX,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;oBACtC,IAAI,IAAI,CAAC,MAAM;wBAAE;oBACjB,IAAI,MAAM,CAAC,QAAQ;AAAE,wBAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;;AAAO,wBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBACrE;YACF;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;QACnC,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,mBAAmB,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;QAChE,KAAK,MAAM,EAAE,IAAI,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,gBAAA,OAAO,IAAI;AAC7E,QAAA,OAAO,KAAK;IACd;;AAGQ,IAAA,SAAS,CAAC,GAAW,EAAA;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AACvC,QAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS;IAClE;AAEA,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;QACnC,MAAM,MAAM,GAAG,CAAC,CAA4B,KAAyB,CAAC,CAAC,CAAC;AACxE,QAAA,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AACxH,QAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AAC3H,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,KAAK,EAAE;YAAE;QAAQ;AACzE,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,QAAA,IAAI;AACF,YAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;gBAAE,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,YAAa,CAAC;YAAE;AACzH,YAAA,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE;gBAAE,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,YAAa,CAAC;YAAE;YAC/H,IAAI,CAAC,KAAK,EAAE;QACd;QAAE,OAAO,GAAG,EAAE;;YAEZ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACxF;gBAAU;AAAE,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAAE;IAC5D;+GA7LW,uCAAuC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uCAAuC,mQChEpD,o6EAqDA,EAAA,MAAA,EAAA,CAAA,+5DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDKI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,0BAA0B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,6LAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,wVAAE,yBAAyB,EAAA,QAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAMxI,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBAVnD,SAAS;+BACE,yCAAyC,EAAA,UAAA,EACvC,IAAI,EAAA,OAAA,EACP;AACP,wBAAA,YAAY,EAAE,eAAe,EAAE,0BAA0B,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,yBAAyB;qBAClJ,EAAA,eAAA,EAEgB,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,o6EAAA,EAAA,MAAA,EAAA,CAAA,+5DAAA,CAAA,EAAA;;sBAU7C;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;AAmLH,SAAS,aAAa,CAAC,IAAmB,EAAA;IACxC,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACtE;AAEA,SAAS,UAAU,CAAC,IAAqB,EAAA;AACvC,IAAA,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;AACpC;AAEA,SAAS,UAAU,CAAC,IAAqB,EAAA;AACvC,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAyB;AAC5C,IAAA,MAAM,IAAI,GAAG,CAAC,KAAsB,KAAI,EAAG,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;QAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAAE,QAAA,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;IAAE,CAAC,CAAC,CAAC;IAC5G,IAAI,CAAC,IAAI,CAAC;AACV,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,UAAU,CAAC,IAAqB,EAAA;AACvC,IAAA,OAAO,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AAC/E;AAEA;AACA,SAAS,SAAS,CAAC,KAAyB,EAAA;IAC1C,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;AAC3E;AAEA;;;AAGG;AACG,SAAU,mBAAmB,CAAC,KAAsB,EAAE,IAAY,EAAA;IACtE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACrC,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,KAAK;AACzB,IAAA,MAAM,IAAI,GAAG,CAAC,IAAqB,KAAsB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AAC1E,QAAA,IAAI,CAAC,CAAC,QAAQ,EAAE;YACd,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjC,YAAA,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE;QACpD;AACA,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1F,QAAA,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;AAC7C,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB;;ME5Qa,6BAA6B,CAAA;AAaxC,IAAA,WAAA,CAAoB,OAA2B,EAAA;QAA3B,IAAA,CAAA,OAAO,GAAP,OAAO;AAZR,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;;AAE3C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,yBAAyB,CAAC;QACpD,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,KAAK,GAAG,EAAE;QACnB,IAAA,CAAA,OAAO,GAAkB,EAAE;QAC3B,IAAA,CAAA,eAAe,GAAU,EAAE;QAC3B,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,UAAU,GAAG,KAAK;QAClB,IAAA,CAAA,eAAe,GAAG,KAAK;QACvB,IAAA,CAAA,cAAc,GAAuB,IAAI;QAGhC,IAAA,CAAA,KAAK,GAAG,CAAC,CAAc,KAAK,CAAC,CAAC,WAAW;AACzC,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAA4B,MAAM;YAC3D,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC5F,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE;;AAErG,YAAA,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;AACvE,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACO,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAmC,MAAM;AACrE,YAAA;AACE,gBAAA,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI;AAClE,gBAAA,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;AACxJ,aAAA;AACF,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IAdgD;AAgBlD,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAAE,IAAI,CAAC,IAAI,EAAE;QAAE;AACrC,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE;YAAE,IAAI,CAAC,UAAU,EAAE;QAAE;IAChD;AAEA,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,IAAI,CAAC,OAAO,GAAG,EAAE;YAAE;QAAQ;AAC9C,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;YACzE,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAc,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC;QACpF;gBACQ;AAAE,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAAE;IAC3D;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;YAAE;QAAQ;AACzD,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvD,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpE,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,UAAU,GAAA,EAAK,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAA,EAAK,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;;IAEvC,MAAM,cAAc,CAAC,UAAkB,EAAA;QACrC,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAAE,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE;IACjH;AACA,IAAA,eAAe,CAAC,QAAqB,EAAA,EAAI,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAEtG,IAAA,QAAQ,CAAC,CAAuC,EAAA;AAC9C,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;IACxE;+GA7DW,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7B1C,4tCAoCA,EAAA,MAAA,EAAA,CAAA,o9CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDdI,YAAY,mIAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAiB,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,OAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,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,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpG,kCAAkC,6KAAE,uCAAuC,EAAA,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAMlE,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAXzC,SAAS;+BACE,+BAA+B,EAAA,UAAA,EAC7B,IAAI,EAAA,OAAA,EACP;wBACP,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY;AACpG,wBAAA,kCAAkC,EAAE,uCAAuC;qBAC5E,EAAA,eAAA,EAEgB,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,4tCAAA,EAAA,MAAA,EAAA,CAAA,o9CAAA,CAAA,EAAA;;sBAQ7C;;sBACA;;;MEfU,iCAAiC,CAAA;AAS5C,IAAA,WAAA,CAAoB,OAA2B,EAAA;QAA3B,IAAA,CAAA,OAAO,GAAP,OAAO;AARR,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;;AAE3C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;QACzC,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,KAAK,GAAG,EAAE;QACnB,IAAA,CAAA,UAAU,GAAmB,EAAE;QAC/B,IAAA,CAAA,OAAO,GAAG,KAAK;QAGN,IAAA,CAAA,KAAK,GAAG,CAAC,EAAgB,KAAK,EAAE,CAAC,YAAY;AAC7C,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAA6B,MAAM;YAC5D,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;YACnG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;YACvF,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;YACpF,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,WAAW,IAAI,GAAG,EAAE;AAC7F,YAAA,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE;AACrI,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;IATgD;;AAYlD,IAAA,UAAU,CAAC,EAAgB,EAAA;QACzB,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IACvG;IAEA,WAAW,CAAC,OAAsB,EAAA,EAAI,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,IAAI,EAAE;AAAE,IAAA,CAAC,CAAC;AAE7E,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;YAAE;QAAQ;AACjD,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI;AAAE,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;AAAE,YAAA,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU;QAAE;gBAC5G;AAAE,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAAE;IAC3D;;AAGA,IAAA,aAAa,CAAC,KAAgC,EAAA;AAC5C,QAAA,OAAO,aAAa,CAAC,KAAK,CAAC;IAC7B;+GArCW,iCAAiC,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,kBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpB9C,ksBAqBA,EAAA,MAAA,EAAA,CAAA,o9CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDNY,YAAY,mIAAE,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,OAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,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,KAAA,EAAA,CAAA,CAAA;;4FAKnE,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAR7C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mCAAmC,EAAA,UAAA,EACjC,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,CAAC,EAAA,eAAA,EAE9D,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,ksBAAA,EAAA,MAAA,EAAA,CAAA,o9CAAA,CAAA,EAAA;;sBAQ7C;;sBACA;;;AEXH;AACO,MAAM,kBAAkB,GAAG,GAAG;AACrC;AACO,MAAM,sBAAsB,GAAG,EAAE;AACxC;AACO,MAAM,kBAAkB,GAAG,GAAG;AAErC;AACM,SAAU,YAAY,CAAC,IAAU,EAAA;AACrC,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;AAC5B,IAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACtD,IAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACjD,IAAA,OAAO,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE;AACzB;AAEA;AACM,SAAU,YAAY,CAAC,IAAU,EAAE,IAAY,EAAA;IACnD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;AACnC,IAAA,OAAO,YAAY,CAAC,IAAI,CAAC;AAC3B;AAEA;;;;AAIG;AACG,SAAU,gBAAgB,CAAC,KAAa,EAAA;AAC5C,IAAA,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AAC9C,IAAA,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;AAC5C;AAEA;AACA,SAAS,kBAAkB,CAAC,GAAW,EAAE,GAAW,EAAA;IAClD,OAAO,CAAC,OAAuC,KAA6B;AAC1E,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;AAC3B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;QACvB,IAAI,KAAK,GAAG,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC3D,IAAI,KAAK,GAAG,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;AAC3D,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AACH;AAaA;;;;;AAKG;MAYU,+BAA+B,CAAA;AAX5C,IAAA,WAAA,GAAA;AAYqB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;;AAE3C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAClC,IAAA,CAAA,aAAa,GAAG,aAAa;QAC7B,IAAA,CAAA,OAAO,GAAG,kBAAkB;QAEtC,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,KAAK,GAAG,EAAE;QACV,IAAA,CAAA,IAAI,GAAG,KAAK;AACX,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAW;;AAExC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;QAE5C,IAAA,CAAA,OAAO,GAAG,YAAY,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACrC,IAAA,CAAA,OAAO,GAAG,YAAY,CAAC,IAAI,IAAI,EAAE,EAAE,kBAAkB,CAAC;QAE7C,IAAA,CAAA,IAAI,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;AAC9H,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACxD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,WAAW,CAAgB,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEhG,IAAA,CAAA,IAAI,GAAmB,EAAE;QACzB,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,MAAM,GAAG,KAAK;QACd,IAAA,CAAA,SAAS,GAAkB,IAAI;;QAE/B,IAAA,CAAA,YAAY,GAA2C,IAAI;AAsF5D,IAAA;;AAnFC,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;IAC3F;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK;IAC7G;IAEA,IAAI,WAAW,KAAc,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAErE,WAAW,CAAC,OAAsB,EAAA,EAAI,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI;AAAE,QAAA,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;;AAG3F,IAAA,MAAM,KAAK,GAAA;QACT,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,IAAI,EAAE,EAAE,kBAAkB,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnG,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC;AACtE,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE;AACd,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACvB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;AAC1E,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,EAAO,MAAM;gBACnD,YAAY,EAAE,EAAE,CAAC,YAAY;gBAC7B,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,WAAW,EAAE,EAAE,CAAC,WAAW;AAC3B,gBAAA,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;gBAClD,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO;sBACzC,IAAI,WAAW,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;AAC9C,sBAAE,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC7E,aAAA,CAAC,CAAC;QACL;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;QACjF;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;AAEA,IAAA,iBAAiB,CAAC,KAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK;AACjB,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACpC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;IAEA,KAAK,GAAA,EAAK,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;AAEzC,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK;YAAE;AAC5C,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACvB,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACnC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE;AACjD,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE;gBACvE,IAAI;AACJ,gBAAA,IAAI,WAAW,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;gBACvC,UAAU,EAAE,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;;AAElD,gBAAA,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC;AAC9F,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;AAChE,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACrB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;QACjF;gBAAU;AACR,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;AAEA,IAAA,cAAc,CAAC,IAAY,EAAA,EAAY,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACtG,IAAA,UAAU,CAAC,IAAY,EAAA,EAAY,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;+GAhHnF,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtF5C,s4FAgDA,EAAA,MAAA,EAAA,CAAA,02EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED+BI,YAAY,+PAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,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,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,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,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,YAAA,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,EAC/H,cAAc,uSAAE,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,YAAY,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,aAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,aAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAMtD,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAX3C,SAAS;+BACE,iCAAiC,EAAA,UAAA,EAC/B,IAAI,EAAA,OAAA,EACP;wBACP,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB;AAC/H,wBAAA,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB;qBAChE,EAAA,eAAA,EAEgB,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,s4FAAA,EAAA,MAAA,EAAA,CAAA,02EAAA,CAAA,EAAA;;sBAW7C;;sBACA;;sBACA;;sBACA;;sBAEA;;;AElFH;;;;;AAKG;MAYU,6BAA6B,CAAA;AAX1C,IAAA,WAAA,GAAA;AAYqB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;AAC3C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;;AAEhC,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACpC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAC1C,IAAA,CAAA,QAAQ,GAAG,EAAE;QACb,IAAA,CAAA,KAAK,GAAG,EAAE;QACnB,IAAA,CAAA,MAAM,GAA0B,EAAE;QAClC,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,UAAU,GAAG,KAAK;QAClB,IAAA,CAAA,eAAe,GAAG,KAAK;;QAEvB,IAAA,CAAA,mBAAmB,GAAuD,IAAI;QAErE,IAAA,CAAA,KAAK,GAAG,CAAC,EAAuB,KAAK,EAAE,CAAC,EAAE;AAC1C,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAoC,MAAM;AACnE,YAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YACnG,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,IAAI,EAAE,EAAE;AACxF,YAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC/G,YAAA,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;AACxG,YAAA,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,YAAY,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;;AAE3G,YAAA,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;AACvE,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAEO,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAA2C,MAAM;AAC7E,YAAA;AACE,gBAAA,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI;gBACrE,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU;AACjC,gBAAA,OAAO,EAAE,CAAC,EAAE,MAAM;AAChB,oBAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,yBAAyB;AAC5C,oBAAA,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AACvE,oBAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;iBACpC,CAAC;AACH,aAAA;AACF,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAsEH,IAAA;AApEC,IAAA,WAAW,CAAC,OAAsB,EAAA,EAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC;AAAE,QAAA,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAErG,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE;YAAE;QAAQ;AACrD,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACvB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;YAC5D,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBAAE;YACxD,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE;QAChC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE;YAChB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnF;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,MAAM,CAAC,EAAuB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAA;QAC9C,IAAI,EAAE,CAAC,UAAU;AAAE,YAAA,OAAO,SAAS;QACnC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG;AAAE,YAAA,OAAO,SAAS;AAC9D,QAAA,OAAO,QAAQ;IACjB;AAEA,IAAA,WAAW,CAAC,MAAmB,EAAA;QAC7B,IAAI,MAAM,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY;QACvD,IAAI,MAAM,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY;AACvD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM;IACzB;;AAGA,IAAA,WAAW,CAAC,MAAmB,EAAA;QAC7B,IAAI,MAAM,KAAK,SAAS;AAAE,YAAA,OAAO,SAAS;QAC1C,IAAI,MAAM,KAAK,SAAS;AAAE,YAAA,OAAO,SAAS;AAC1C,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,UAAU,CAAC,KAAgC,EAAA;AACzC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;AACrB,QAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9H;AAEA,IAAA,UAAU,KAAK,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;AAEhE,IAAA,eAAe,CAAC,EAAuB,EAAA;AACrC,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,EAAE;AAC/E,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;;IAGA,MAAM,MAAM,CAAC,EAAuB,EAAA;QAClC,IAAI,EAAE,CAAC,UAAU;YAAE;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF;QAAE,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAClF;QACF;AACA,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE;IACnB;AAEA,IAAA,QAAQ,CAAC,CAA+C,EAAA;AACtD,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD;+GA1GW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClC1C,wtDAiCA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDNI,YAAY,mIAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,OAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,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,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrF,+BAA+B,uJAAE,uCAAuC,EAAA,QAAA,EAAA,yCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAM/D,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAXzC,SAAS;+BACE,+BAA+B,EAAA,UAAA,EAC7B,IAAI,EAAA,OAAA,EACP;AACP,wBAAA,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY;AACrF,wBAAA,+BAA+B,EAAE,uCAAuC;qBACzE,EAAA,eAAA,EAEgB,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,wtDAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA;;sBAU7C;;sBACA;;;AExBH;;;;AAIG;MAYU,wBAAwB,CAAA;AAXrC,IAAA,WAAA,GAAA;AAYqB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;;AAE3C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACrC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAC5C,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAClC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAC5C,IAAA,CAAA,QAAQ,GAAG,EAAE;QACtB,IAAA,CAAA,IAAI,GAAqB,EAAE;QAC3B,IAAA,CAAA,OAAO,GAAG,KAAK;;QAEf,IAAA,CAAA,aAAa,GAAG,EAAE;;QAElB,IAAA,CAAA,GAAG,GAA0B,IAAI;QACjC,IAAA,CAAA,QAAQ,GAA0B,IAAI;QACtC,IAAA,CAAA,YAAY,GAAG,KAAK;QACpB,IAAA,CAAA,SAAS,GAAQ,YAAY;QAC7B,IAAA,CAAA,SAAS,GAAkB,IAAI;;QAE/B,IAAA,CAAA,aAAa,GAA4C,IAAI;QAC7D,IAAA,CAAA,cAAc,GAAG,KAAK;;QAGtB,IAAA,CAAA,eAAe,GAAqB,EAAE;AAsHvC,IAAA;;AAnHC,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE;AACvB,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AAAE,YAAA,IAAI,CAAC,IAAI,GAAG,EAAE;AAAE,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AAAE,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACrI,YAAA,KAAK,IAAI,CAAC,IAAI,EAAE;QAClB;IACF;AAEA,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC9B,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,IAAI,CAAC,IAAI,GAAG,EAAE;AAAE,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;YAAE;QAAQ;AACpE,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACvB,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AAChD,YAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBAAE;YAChC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;AAC1B,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;;YAErF,IAAI,IAAI,CAAC,GAAG;gBAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAI,CAAC,EAAE,CAAC,IAAI,IAAI;YAC7E,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC;AAAE,gBAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACxG;gBAAU;AAAE,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QAAE;IAC7D;;IAGA,SAAS,GAAA;QACP,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC;AAC5D,QAAA,IAAI,CAAC;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxB;;AAGA,IAAA,OAAO,CAAC,CAAiB,EAAA;QACvB,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE;AAAE,YAAA,IAAI,CAAC,SAAS,GAAG,YAAY;AACxD,QAAA,IAAI,CAAC,GAAG,GAAG,CAAC;AACZ,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE;AACzB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,MAAM,CAAC,GAAQ,EAAA,EAAI,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;IACzC,UAAU,GAAA,EAAK,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IACxF,QAAQ,CAAC,IAA2B,IAAI,CAAC,GAAG,EAAA,EAAI,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAEtI,MAAM,UAAU,CAAC,MAAe,EAAA;AAC9B,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM;AACnC,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE;AACjB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,MAAM,aAAa,CAAC,CAAA,GAA2B,IAAI,CAAC,GAAG,EAAA;AACrD,QAAA,IAAI,CAAC,CAAC;YAAE;QACR,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAC1E,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE;IACnB;AAEA;;;;AAIG;AACH,IAAA,MAAM,YAAY,CAAC,CAAA,GAA2B,IAAI,CAAC,GAAG,EAAA;AACpD,QAAA,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc;YAAE;QAC/B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACpC,YAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,0BAA0B;AAC7C,YAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB;AACtC,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;AACpC,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACvB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,aAAa,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;QACnE;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC7C;gBAAU;AACR,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;;AAGA,IAAA,kBAAkB,KAAK,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;AAE3E,IAAA,oBAAoB,CAAC,IAAY,EAAA,EAAY,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7G,IAAA,kBAAkB,CAAC,IAAY,EAAA,EAAY,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAEjG,IAAA,eAAe,CAAC,GAAY,EAAA;AAClC,QAAA,IAAI,GAAG,YAAY,iBAAiB,EAAE;AACpC,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;AAAE,gBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB;AAC7D,YAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;AAAE,gBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB;AAC9D,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM;AAChC,YAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM;AAAE,gBAAA,OAAO,MAAM;QACzD;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB;IACpC;;AAGA,IAAA,MAAM,SAAS,CAAC,CAAA,GAA2B,IAAI,CAAC,GAAG,EAAA;AACjD,QAAA,IAAI,CAAC,CAAC;YAAE;QACR,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACpC,YAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,uBAAuB;YAC1C,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5E,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;AAC9B,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;AACF,QAAA,IAAI,EAAE;AAAE,YAAA,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACjC;;IAGA,MAAM,SAAS,CAAC,CAAiB,EAAA;QAC/B,IAAI,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE;QACnF,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE;AAAE,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QAAE;AACvE,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE;IACnB;+GA7IW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClCrC,wpIAkFA,EAAA,MAAA,EAAA,CAAA,o9CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvDI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,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,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,qPAAE,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,SAAA,EAAA,MAAA,EAAA,UAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,YAAA,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,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,IAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,2BAAA,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,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpL,6BAA6B,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iCAAiC,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,6BAA6B,yGAAE,6BAA6B,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAMrH,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAXpC,SAAS;+BACE,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP;AACP,wBAAA,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY;AACpL,wBAAA,6BAA6B,EAAE,iCAAiC,EAAE,6BAA6B,EAAE,6BAA6B;qBAC/H,EAAA,eAAA,EAEgB,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,wpIAAA,EAAA,MAAA,EAAA,CAAA,o9CAAA,CAAA,EAAA;;sBAW7C;;;AErCH;;;AAGG;MASU,oBAAoB,CAAA;AARjC,IAAA,WAAA,GAAA;QASE,IAAA,CAAA,MAAM,GAA6B,IAAI;AAGxC,IAAA;IADC,cAAc,CAAC,CAA2B,EAAA,EAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;+GAHpD,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,8ECjBjC,6WAKA,EAAA,MAAA,EAAA,CAAA,g8CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDOY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gCAAgC,wGAAE,wBAAwB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;4FAKvE,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,gCAAgC,EAAE,wBAAwB,CAAC,EAAA,eAAA,EAElE,uBAAuB,CAAC,KAAK,EAAA,QAAA,EAAA,6WAAA,EAAA,MAAA,EAAA,CAAA,g8CAAA,CAAA,EAAA;;;"}
|
|
@@ -29,7 +29,9 @@ ativo. A tela mostra as abas **Rotas**, **Roteadores** e **Acesso**.
|
|
|
29
29
|
|
|
30
30
|
## Aba Rotas
|
|
31
31
|
|
|
32
|
-
A tabela mostra **Nome**, **
|
|
32
|
+
A tabela mostra **Nome**, **Display**, **Ícone**, **Path**, **Excluível** e **ID**. O botão da coluna **ID** copia o
|
|
33
|
+
UUID da rota: cole-o no campo **ID (opcional)** ao criar a mesma rota no outro ambiente (homologação e produção com o
|
|
34
|
+
mesmo id).
|
|
33
35
|
|
|
34
36
|
- **Nova rota** abre o formulário:
|
|
35
37
|
- **Nome interno** (obrigatório) e **Nome de exibição** (o texto que aparece no menu).
|
|
@@ -45,8 +47,9 @@ A tabela mostra **Nome**, **Exibição**, **Ícone**, **Path** e **Excluível**.
|
|
|
45
47
|
|
|
46
48
|
## Aba Roteadores
|
|
47
49
|
|
|
48
|
-
A tabela mostra **Página**, **Caminho
|
|
49
|
-
**Público**)
|
|
50
|
+
A tabela mostra **Página**, **Caminho** (o endereço final), **Descrição**, **Visibilidade** (**Privado** ou
|
|
51
|
+
**Público**), **Crachás permitidos** (os crachás que podem receber acesso à tela, ou **Qualquer crachá**) e **ID**
|
|
52
|
+
(botão que copia o UUID do roteador, para criar o mesmo roteador com o mesmo id no outro ambiente).
|
|
50
53
|
|
|
51
54
|
- **Novo roteador** (habilitado quando já existe alguma rota) abre o formulário:
|
|
52
55
|
- **Página** (obrigatório): a rota que vira a tela.
|
|
@@ -66,16 +69,17 @@ A tabela mostra **Página**, **Caminho montado** (o endereço final), **Descriç
|
|
|
66
69
|
|
|
67
70
|
## Aba Acesso
|
|
68
71
|
|
|
69
|
-
A tabela mostra os grupos com acesso ao client: **Grupo
|
|
72
|
+
A tabela mostra os grupos com acesso ao client: **Grupo**, **Tipo** (o crachá do grupo, em etiqueta) e **Guards**.
|
|
70
73
|
|
|
71
74
|
- **Novo acesso**: escolha o **Grupo** e clique em **Criar**.
|
|
72
|
-
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
- **Gerenciar rotas** (botão na coluna **Guards**) abre o painel **Rotas de nome do grupo**, com a árvore dos
|
|
76
|
+
roteadores privados: as pastas são os níveis do menu e cada página tem uma caixa de seleção. Só aparecem os
|
|
77
|
+
roteadores privados sem restrição de crachá ou cujo crachá permitido inclua o do grupo. No topo fica só o campo
|
|
78
|
+
**Filtrar rotas** (casa com o nome da tela ou da pasta, sem diferenciar acentos, e abre as pastas encontradas).
|
|
79
|
+
Marque as telas que o grupo pode ver, desmarque as que não pode e clique em **Confirmar alterações** (o botão só
|
|
80
|
+
habilita quando algo mudou).
|
|
81
|
+
- No menu de cada linha, **Remover** pede confirmação (**Remover acesso?**, com o nome do grupo) e só então tira o
|
|
82
|
+
acesso do grupo ao client.
|
|
79
83
|
- O grupo de administração do projeto não aparece aqui (nem na lista, nem em **Novo acesso**): o acesso dele é
|
|
80
84
|
gerido só no painel central (Argos).
|
|
81
85
|
|
|
@@ -86,4 +90,4 @@ item continua na tabela.
|
|
|
86
90
|
`;
|
|
87
91
|
|
|
88
92
|
export { client_usage as default };
|
|
89
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-client.usage-
|
|
93
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-client.usage-B16r3IHk.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-client.usage-B16r3IHk.mjs","sources":["../../../projects/ui/auto-service/src/docs/client.usage.ts"],"sourcesContent":["// Manual de uso da tela Cliente do auto-serviço (`RouteDocument.load`), em Markdown. Módulo próprio,\n// carregado só pelo `import()` de `AUTO_SERVICE_DOCUMENTS`: vira um chunk à parte no FESM e fica fora do\n// bundle inicial. Não importe estaticamente nem reexporte no `public-api.ts`.\nexport default `# Cliente\n\nGerencie a navegação do seu client sem depender do painel central: as rotas (os itens do menu), os roteadores\n(onde cada tela aparece e se ela é privada) e o acesso (quais grupos veem quais telas privadas).\n\n## Antes de começar\n\nComo nas outras telas do auto-serviço, o client administrado é o do app em que você está logado: não há client\npara escolher. É preciso estar no grupo de administração do projeto desse app e com o crachá **Administrador**\nativo. A tela mostra as abas **Rotas**, **Roteadores** e **Acesso**.\n\n## Como as peças se encaixam\n\n- **Rota:** um item com nome, nome de exibição, ícone e um trecho do endereço. Sozinha, ela não vira tela.\n- **Roteador:** coloca uma rota como **página** e diz em que ponto do menu ela fica (Header › Navegação › Menu ›\n Item › Submenu, todos opcionais). O endereço final da tela é a soma dos trechos das rotas dessa cadeia.\n- **Acesso:** libera o client para um grupo. Em cada acesso você escolhe quais roteadores **privados** aquele grupo\n enxerga.\n\n## Selos e travas\n\n- **Template:** o item veio do template da aplicação. Só a administração central do Argos edita ou exclui; aqui a\n linha aparece sem o menu de ações. A ordem e o acesso desses itens continuam sendo seus.\n- **Rota protegida** (**Excluível: Não**): não pode ser excluída. Ao editá-la, a caixa **Excluível** fica travada:\n só a administração central libera a exclusão.\n\n## Aba Rotas\n\nA tabela mostra **Nome**, **Display**, **Ícone**, **Path**, **Excluível** e **ID**. O botão da coluna **ID** copia o\nUUID da rota: cole-o no campo **ID (opcional)** ao criar a mesma rota no outro ambiente (homologação e produção com o\nmesmo id).\n\n- **Nova rota** abre o formulário:\n - **Nome interno** (obrigatório) e **Nome de exibição** (o texto que aparece no menu).\n - **Ícone**: escolha no catálogo; dá para digitar para filtrar, e cada opção mostra o próprio ícone.\n - **Caminho (path)**: um trecho só do endereço, com letras minúsculas e hífen (por exemplo, \\`ordens-servico\\`),\n sem \\`/\\`, espaço, número ou acento, e sem hífen no início ou no fim. O \\`/\\` entre os níveis quem monta é o\n roteador. Deixe vazio numa rota que só agrupa itens do menu.\n - **Info** e **Excluível**.\n- No menu de cada linha: **Editar** e **Excluir** (este só em rota excluível). **Excluir** pede confirmação\n (**Excluir rota?**, com o nome dela) e só apaga depois de **Excluir** no diálogo.\n- **Reordenar:** define a ordem dos itens no menu de navegação. A ordem é do seu client: vale também para itens do\n template, e a sincronização do template não a desfaz.\n\n## Aba Roteadores\n\nA tabela mostra **Página**, **Caminho** (o endereço final), **Descrição**, **Visibilidade** (**Privado** ou\n**Público**), **Crachás permitidos** (os crachás que podem receber acesso à tela, ou **Qualquer crachá**) e **ID**\n(botão que copia o UUID do roteador, para criar o mesmo roteador com o mesmo id no outro ambiente).\n\n- **Novo roteador** (habilitado quando já existe alguma rota) abre o formulário:\n - **Página** (obrigatório): a rota que vira a tela.\n - **Descrição**: o que a tela faz, em uma frase. Aparece abaixo do título, na barra da página.\n - **Hierarquia (opcional)**: as rotas de **Header**, **Navegação**, **Menu**, **Item** e **Submenu** acima da página.\n A hierarquia é **de cima para baixo**: **Navegação** só abre com um **Header** escolhido, **Menu** só com uma\n **Navegação**, **Item** só com um **Menu** e **Submenu** só com um **Item**. Limpar um nível limpa os de baixo. A\n página não depende de nível nenhum. Um roteador antigo com um nível vazio no meio mostra o aviso e só salva depois\n de preencher o nível que falta (ou limpar os de baixo).\n - **Privado** (já vem marcado): a tela só fica visível para os grupos que receberem acesso a ela na aba **Acesso**.\n Desmarcado, o roteador é **Público** e não depende dessa liberação.\n - **Crachás permitidos**: escolha um ou mais crachás (tipos de grupo, inclusive **Administrador**) para limitar\n quem pode receber acesso a esta tela na aba **Acesso**. Vazio = **Qualquer crachá**.\n- No menu de cada linha: **Editar** e **Excluir**. **Excluir** pede confirmação (**Excluir roteador?**, com o caminho\n montado) e só apaga depois de **Excluir** no diálogo; a página sai do menu.\n- Se o servidor recusar a gravação, o motivo aparece no próprio formulário, que continua aberto.\n\n## Aba Acesso\n\nA tabela mostra os grupos com acesso ao client: **Grupo**, **Tipo** (o crachá do grupo, em etiqueta) e **Guards**.\n\n- **Novo acesso**: escolha o **Grupo** e clique em **Criar**.\n- **Gerenciar rotas** (botão na coluna **Guards**) abre o painel **Rotas de nome do grupo**, com a árvore dos\n roteadores privados: as pastas são os níveis do menu e cada página tem uma caixa de seleção. Só aparecem os\n roteadores privados sem restrição de crachá ou cujo crachá permitido inclua o do grupo. No topo fica só o campo\n **Filtrar rotas** (casa com o nome da tela ou da pasta, sem diferenciar acentos, e abre as pastas encontradas).\n Marque as telas que o grupo pode ver, desmarque as que não pode e clique em **Confirmar alterações** (o botão só\n habilita quando algo mudou).\n- No menu de cada linha, **Remover** pede confirmação (**Remover acesso?**, com o nome do grupo) e só então tira o\n acesso do grupo ao client.\n- O grupo de administração do projeto não aparece aqui (nem na lista, nem em **Novo acesso**): o acesso dele é\n gerido só no painel central (Argos).\n\nDepois de cada exclusão aparece **Exclusão concluída.**; se o servidor recusar, a mensagem de erro diz o motivo e o\nitem continua na tabela.\n\n> Quem participa de cada grupo se gerencia na tela **Grupos**.\n`;\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA,mBAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFd;;"}
|
|
@@ -37,11 +37,11 @@ const AUTO_SERVICE_HOME_TEMPLATE_ROUTER_ID = '6a9a13db-f31b-494e-b51c-79af0ac28b
|
|
|
37
37
|
*/
|
|
38
38
|
const AUTO_SERVICE_SCREENS = {
|
|
39
39
|
home: () => import('./trismegisto-spine-auto-service-home.component-5_aji1hf.mjs').then(m => m.HomeComponent),
|
|
40
|
-
groups: () => import('./trismegisto-spine-auto-service-auto-service-groups.component-
|
|
41
|
-
apps: () => import('./trismegisto-spine-auto-service-auto-service.component-
|
|
42
|
-
client: () => import('./trismegisto-spine-auto-service-auto-service-client.component-
|
|
43
|
-
audit: () => import('./trismegisto-spine-auto-service-auto-service-audit.component-
|
|
44
|
-
loginAttempts: () => import('./trismegisto-spine-auto-service-auto-service-login-attempts.component-
|
|
40
|
+
groups: () => import('./trismegisto-spine-auto-service-auto-service-groups.component-2xCG_wS9.mjs').then(m => m.AutoServiceGroupsComponent),
|
|
41
|
+
apps: () => import('./trismegisto-spine-auto-service-auto-service.component-C4FBAefe.mjs').then(m => m.AutoServiceComponent),
|
|
42
|
+
client: () => import('./trismegisto-spine-auto-service-auto-service-client.component-DzmlpLPu.mjs').then(m => m.AutoServiceClientComponent),
|
|
43
|
+
audit: () => import('./trismegisto-spine-auto-service-auto-service-audit.component-tfGcVR3i.mjs').then(m => m.AutoServiceAuditComponent),
|
|
44
|
+
loginAttempts: () => import('./trismegisto-spine-auto-service-auto-service-login-attempts.component-CRvxfSWD.mjs').then(m => m.AutoServiceLoginAttemptsComponent),
|
|
45
45
|
};
|
|
46
46
|
/**
|
|
47
47
|
* Documentação das 6 telas (botão de documentação da barra da página e índice "Documentação do sistema"): o manual
|
|
@@ -61,11 +61,11 @@ const AUTO_SERVICE_DOCUMENTS = {
|
|
|
61
61
|
loadTechnical: () => import('./trismegisto-spine-auto-service-groups.technical-D05838rU.mjs').then(m => m.default),
|
|
62
62
|
},
|
|
63
63
|
apps: {
|
|
64
|
-
load: () => import('./trismegisto-spine-auto-service-apps.usage-
|
|
64
|
+
load: () => import('./trismegisto-spine-auto-service-apps.usage-po9Ds_SU.mjs').then(m => m.default),
|
|
65
65
|
loadTechnical: () => import('./trismegisto-spine-auto-service-apps.technical-D3W2Vwic.mjs').then(m => m.default),
|
|
66
66
|
},
|
|
67
67
|
client: {
|
|
68
|
-
load: () => import('./trismegisto-spine-auto-service-client.usage-
|
|
68
|
+
load: () => import('./trismegisto-spine-auto-service-client.usage-B16r3IHk.mjs').then(m => m.default),
|
|
69
69
|
loadTechnical: () => import('./trismegisto-spine-auto-service-client.technical-DP5G8i3o.mjs').then(m => m.default),
|
|
70
70
|
},
|
|
71
71
|
audit: {
|
|
@@ -1540,6 +1540,8 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1540
1540
|
tabRouters: 'Roteadores',
|
|
1541
1541
|
tabAccess: 'Acesso',
|
|
1542
1542
|
noClients: 'Você não administra este app. É preciso (a) estar no grupo de administração do projeto dele e (b) estar logado com o crachá <strong>Administrador</strong> ativo. Troque de crachá no menu do seu perfil, se disponível, ou peça acesso a quem administra o projeto.',
|
|
1543
|
+
clientsLoadError: 'Não foi possível carregar os clients que você administra (HTTP {status}). Isso não é falta de permissão: o Argos não respondeu. Tente de novo em instantes.',
|
|
1544
|
+
retryLoad: 'Tentar de novo',
|
|
1543
1545
|
pickClient: 'Selecione o client que deseja administrar',
|
|
1544
1546
|
groupsTitle: 'Grupos',
|
|
1545
1547
|
groupsIntro: 'Crie, edite e exclua os grupos deste client e gerencie os membros — sem depender do painel central.',
|
|
@@ -1599,6 +1601,12 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1599
1601
|
noAppAccess: 'Nenhum grupo com acesso a esta aplicação ainda.',
|
|
1600
1602
|
colType: 'Tipo',
|
|
1601
1603
|
manageOperations: 'Gerenciar operações',
|
|
1604
|
+
colOperations: 'Operações',
|
|
1605
|
+
colGuards: 'Guards',
|
|
1606
|
+
filterOperations: 'Filtrar operações',
|
|
1607
|
+
filterRoutes: 'Filtrar rotas',
|
|
1608
|
+
noFilterMatch: 'Nada encontrado para “{term}”.',
|
|
1609
|
+
routesTreeLabel: 'Rotas privadas',
|
|
1602
1610
|
operationsOf: 'Operações de {group}',
|
|
1603
1611
|
noOperations: 'Nenhuma operação registrada para esta aplicação ainda.',
|
|
1604
1612
|
operationsCaption: 'Operações registradas',
|
|
@@ -1626,7 +1634,7 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1626
1634
|
routerDescription: 'Descrição',
|
|
1627
1635
|
routerDescriptionHint: 'O que a tela faz, em uma frase. Aparece abaixo do título, na barra da página. Em roteador herdado de template, o texto do template prevalece no próximo sync.',
|
|
1628
1636
|
colPage: 'Página',
|
|
1629
|
-
colBuiltPath: 'Caminho
|
|
1637
|
+
colBuiltPath: 'Caminho',
|
|
1630
1638
|
colVisibility: 'Visibilidade',
|
|
1631
1639
|
colAllowedBadges: 'Crachás permitidos',
|
|
1632
1640
|
anyBadge: 'Qualquer crachá',
|
|
@@ -1683,9 +1691,13 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1683
1691
|
excludableYes: 'Sim',
|
|
1684
1692
|
excludableNo: 'Não',
|
|
1685
1693
|
colName: 'Nome',
|
|
1686
|
-
colDisplay: '
|
|
1694
|
+
colDisplay: 'Display',
|
|
1687
1695
|
colIcon: 'Ícone',
|
|
1688
1696
|
colPath: 'Path',
|
|
1697
|
+
colId: 'ID',
|
|
1698
|
+
copyRouteId: 'Copiar o ID da rota {name}',
|
|
1699
|
+
copyRouterId: 'Copiar o ID do roteador {name}',
|
|
1700
|
+
idCopied: 'ID copiado',
|
|
1689
1701
|
reorder: 'Reordenar',
|
|
1690
1702
|
reorderTitle: 'Reordenar menu',
|
|
1691
1703
|
reorderHint: 'Mude a ordem em que os itens aparecem no menu do app: arraste pela alça (ou, no teclado, Espaço na alça e as setas) ou use os botões de subir e descer. Para ordenar o que fica dentro de um item, entre nele.',
|
|
@@ -1709,7 +1721,7 @@ const SPINE_MESSAGES_PT_BR = {
|
|
|
1709
1721
|
pickAccessLevel: 'Selecione o nível',
|
|
1710
1722
|
noLevel: 'Sem nível',
|
|
1711
1723
|
noGroupsOfLevel: 'Nenhum grupo neste nível.',
|
|
1712
|
-
colStatus: '
|
|
1724
|
+
colStatus: 'Status',
|
|
1713
1725
|
groupName: 'Nome',
|
|
1714
1726
|
groupType: 'Tipo',
|
|
1715
1727
|
groupTypePlaceholder: 'Selecione o tipo',
|
|
@@ -2608,6 +2620,8 @@ const SPINE_MESSAGES_EN = {
|
|
|
2608
2620
|
tabRouters: 'Routers',
|
|
2609
2621
|
tabAccess: 'Access',
|
|
2610
2622
|
noClients: "You don't manage this app. You need to (a) be in its project's administration group and (b) be signed in with the <strong>Administrator</strong> badge active. Switch badges in your profile menu, if available, or ask whoever manages the project for access.",
|
|
2623
|
+
clientsLoadError: 'Could not load the clients you administer (HTTP {status}). This is not a permission issue: Argos did not respond. Try again in a moment.',
|
|
2624
|
+
retryLoad: 'Try again',
|
|
2611
2625
|
pickClient: 'Select the client you want to manage',
|
|
2612
2626
|
groupsTitle: 'Groups',
|
|
2613
2627
|
groupsIntro: "Create, edit and delete this client's groups and manage their members — without relying on the central panel.",
|
|
@@ -2667,6 +2681,12 @@ const SPINE_MESSAGES_EN = {
|
|
|
2667
2681
|
noAppAccess: 'No group has access to this application yet.',
|
|
2668
2682
|
colType: 'Type',
|
|
2669
2683
|
manageOperations: 'Manage operations',
|
|
2684
|
+
colOperations: 'Operations',
|
|
2685
|
+
colGuards: 'Guards',
|
|
2686
|
+
filterOperations: 'Filter operations',
|
|
2687
|
+
filterRoutes: 'Filter routes',
|
|
2688
|
+
noFilterMatch: 'Nothing matches “{term}”.',
|
|
2689
|
+
routesTreeLabel: 'Private routes',
|
|
2670
2690
|
operationsOf: 'Operations for {group}',
|
|
2671
2691
|
noOperations: 'No operation registered for this application yet.',
|
|
2672
2692
|
operationsCaption: 'Registered operations',
|
|
@@ -2754,6 +2774,10 @@ const SPINE_MESSAGES_EN = {
|
|
|
2754
2774
|
colDisplay: 'Display',
|
|
2755
2775
|
colIcon: 'Icon',
|
|
2756
2776
|
colPath: 'Path',
|
|
2777
|
+
colId: 'ID',
|
|
2778
|
+
copyRouteId: 'Copy the ID of route {name}',
|
|
2779
|
+
copyRouterId: 'Copy the ID of router {name}',
|
|
2780
|
+
idCopied: 'ID copied',
|
|
2757
2781
|
reorder: 'Reorder',
|
|
2758
2782
|
reorderTitle: 'Reorder menu',
|
|
2759
2783
|
reorderHint: 'Change the order in which items appear in the app menu: drag by the handle (or, on the keyboard, Space on the handle and the arrow keys) or use the up and down buttons. To order what sits inside an item, open it.',
|
|
@@ -3676,6 +3700,8 @@ const SPINE_MESSAGES_ES = {
|
|
|
3676
3700
|
tabRouters: 'Enrutadores',
|
|
3677
3701
|
tabAccess: 'Acceso',
|
|
3678
3702
|
noClients: 'No administras esta app. Necesitas (a) estar en el grupo de administración de su proyecto y (b) haber iniciado sesión con la credencial <strong>Administrador</strong> activa. Cambia de credencial en el menú de tu perfil, si está disponible, o pide acceso a quien administra el proyecto.',
|
|
3703
|
+
clientsLoadError: 'No fue posible cargar los clients que administra (HTTP {status}). No es falta de permiso: Argos no respondió. Inténtelo de nuevo en un momento.',
|
|
3704
|
+
retryLoad: 'Intentar de nuevo',
|
|
3679
3705
|
pickClient: 'Selecciona el client que quieres administrar',
|
|
3680
3706
|
groupsTitle: 'Grupos',
|
|
3681
3707
|
groupsIntro: 'Crea, edita y elimina los grupos de este client y gestiona sus miembros — sin depender del panel central.',
|
|
@@ -3735,6 +3761,12 @@ const SPINE_MESSAGES_ES = {
|
|
|
3735
3761
|
noAppAccess: 'Ningún grupo tiene acceso a esta aplicación todavía.',
|
|
3736
3762
|
colType: 'Tipo',
|
|
3737
3763
|
manageOperations: 'Gestionar operaciones',
|
|
3764
|
+
colOperations: 'Operaciones',
|
|
3765
|
+
colGuards: 'Guards',
|
|
3766
|
+
filterOperations: 'Filtrar operaciones',
|
|
3767
|
+
filterRoutes: 'Filtrar rutas',
|
|
3768
|
+
noFilterMatch: 'Nada coincide con “{term}”.',
|
|
3769
|
+
routesTreeLabel: 'Rutas privadas',
|
|
3738
3770
|
operationsOf: 'Operaciones de {group}',
|
|
3739
3771
|
noOperations: 'Ninguna operación registrada para esta aplicación todavía.',
|
|
3740
3772
|
operationsCaption: 'Operaciones registradas',
|
|
@@ -3822,6 +3854,10 @@ const SPINE_MESSAGES_ES = {
|
|
|
3822
3854
|
colDisplay: 'Visible',
|
|
3823
3855
|
colIcon: 'Ícono',
|
|
3824
3856
|
colPath: 'Path',
|
|
3857
|
+
colId: 'ID',
|
|
3858
|
+
copyRouteId: 'Copiar el ID de la ruta {name}',
|
|
3859
|
+
copyRouterId: 'Copiar el ID del enrutador {name}',
|
|
3860
|
+
idCopied: 'ID copiado',
|
|
3825
3861
|
reorder: 'Reordenar',
|
|
3826
3862
|
reorderTitle: 'Reordenar menú',
|
|
3827
3863
|
reorderHint: 'Cambie el orden en que los elementos aparecen en el menú de la app: arrastre por el asa (o, con el teclado, Espacio en el asa y las flechas) o use los botones de subir y bajar. Para ordenar lo que hay dentro de un elemento, entre en él.',
|