@praxisui/list 1.0.0-beta.28 → 1.0.0-beta.29
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/praxisui-list.mjs +108 -14
- package/fesm2022/praxisui-list.mjs.map +1 -1
- package/index.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"praxisui-list.mjs","sources":["../../../projects/praxis-list/src/lib/utils/template-evaluator.ts","../../../projects/praxis-list/src/lib/utils/selection-adapter.ts","../../../projects/praxis-list/src/lib/services/list-data.service.ts","../../../projects/praxis-list/src/lib/services/list-skin.service.ts","../../../projects/praxis-list/src/lib/components/list-skin-preview.component.ts","../../../projects/praxis-list/src/lib/components/list-skin-preview.component.html","../../../projects/praxis-list/src/lib/utils/templating-inference.ts","../../../projects/praxis-list/src/lib/editors/list-config-editor.component.ts","../../../projects/praxis-list/src/lib/components/praxis-list.component.ts","../../../projects/praxis-list/src/lib/components/praxis-list.component.html","../../../projects/praxis-list/src/lib/praxis-list.metadata.ts","../../../projects/praxis-list/src/public-api.ts","../../../projects/praxis-list/src/praxisui-list.ts"],"sourcesContent":["import { TemplateDef } from '../models/list-config.model';\n\n/**\n * Very small template evaluator that supports `${item.foo}` expressions.\n * For security, only string concatenation is supported; no arbitrary code.\n */\nexport function evalExpr(expr: string, ctx: any): string {\n if (!expr) return '';\n // Replace ${...} with values from context (item)\n return expr.replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n try {\n const value = path\n .split('.')\n .reduce((acc: any, k: string) => (acc == null ? undefined : acc[k]), ctx);\n return value == null ? '' : String(value);\n } catch {\n return '';\n }\n });\n}\n\n/**\n * Evaluate a template definition with basic pipe support.\n * Supported pipes:\n * - bool:TrueLabel:FalseLabel (maps truthy/falsey values to provided labels)\n */\nexport function evaluateTemplate(\n def: TemplateDef | undefined,\n item: any,\n): { type: string; value: string; class?: string; style?: string; color?: string; variant?: 'filled'|'outlined'; badge?: { value: string; color?: string; variant?: 'filled'|'outlined' } } | null {\n if (!def) return null;\n // Icons ignore pipes (usually a literal name)\n if (def.type === 'icon') {\n return { type: def.type, value: def.expr, class: def.class, style: def.style } as any;\n }\n\n const { baseExpr, pipe } = splitFirstPipe(def.expr);\n let value = evalExpr(baseExpr, { item });\n\n if (pipe) {\n const { name, args } = parsePipe(pipe);\n if (name === 'bool') {\n const [trueLabel, falseLabel] = parseTwoArgs(args);\n const truthy = toBoolean(value);\n value = truthy ? (trueLabel ?? 'Sim') : (falseLabel ?? 'Não');\n }\n }\n\n const out: any = { type: def.type, value, class: def.class, style: def.style, color: (def as any).color, variant: (def as any).variant };\n if (def.badge?.expr) {\n const { baseExpr: b2, pipe: p2 } = splitFirstPipe(def.badge.expr);\n let badgeVal = evalExpr(b2, { item });\n if (p2) {\n const { name, args } = parsePipe(p2);\n if (name === 'bool') {\n const [trueLabel, falseLabel] = parseTwoArgs(args);\n const truthy = toBoolean(badgeVal);\n badgeVal = truthy ? (trueLabel ?? 'Sim') : (falseLabel ?? 'Não');\n }\n }\n out.badge = {\n value: badgeVal,\n color: def.badge.color,\n variant: def.badge.variant,\n };\n }\n return out;\n}\n\nfunction splitFirstPipe(expr: string): { baseExpr: string; pipe?: string } {\n const idx = expr.indexOf('|');\n if (idx === -1) return { baseExpr: expr.trim() };\n return { baseExpr: expr.slice(0, idx).trim(), pipe: expr.slice(idx + 1).trim() };\n}\n\nfunction parsePipe(pipeSpec: string): { name: string; args?: string } {\n const idx = pipeSpec.indexOf(':');\n if (idx === -1) return { name: pipeSpec.trim() };\n return { name: pipeSpec.slice(0, idx).trim(), args: pipeSpec.slice(idx + 1).trim() };\n}\n\nfunction parseTwoArgs(argSpec?: string): [string | undefined, string | undefined] {\n if (!argSpec) return [undefined, undefined];\n const parts = argSpec.split(':');\n const first = parts[0]?.trim();\n const second = parts[1]?.trim();\n return [first || undefined, second || undefined];\n}\n\nfunction toBoolean(val: any): boolean {\n if (typeof val === 'boolean') return val;\n const s = String(val).trim().toLowerCase();\n return s === 'true' || s === '1' || s === 'yes' || s === 'sim' || s === 'on';\n}\n","import { ListSelectionEvent, PraxisListConfig } from '../models/list-config.model';\n\nexport function adaptSelection(\n config: PraxisListConfig | undefined,\n items: any[],\n): ListSelectionEvent {\n const mode = (config?.selection?.mode ?? 'none') as 'single' | 'multiple';\n const compareBy = config?.selection?.compareBy;\n const ret = config?.selection?.return ?? 'value';\n const value = mode === 'single' ? items[0] ?? null : items;\n const ids = compareBy ? items.map((it) => it?.[compareBy]) : undefined;\n let out: any = value;\n if (ret === 'id') out = mode === 'single' ? ids?.[0] ?? null : ids;\n else if (ret === 'item') out = value;\n else if (ret === 'value') out = mode === 'single' ? value : items;\n\n return {\n mode,\n value: out,\n items,\n ids,\n };\n}\n\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject, Observable, combineLatest, of } from 'rxjs';\nimport { auditTime, catchError, finalize, map, shareReplay, switchMap } from 'rxjs/operators';\nimport { PraxisListConfig } from '../models/list-config.model';\nimport { GenericCrudService } from '@praxisui/core';\n\nexport interface ListSection<T = any> {\n key: string | undefined;\n items: T[];\n}\n\n@Injectable()\nexport class ListDataService<T = any> {\n private config$ = new BehaviorSubject<PraxisListConfig | null>(null);\n private refresh$ = new BehaviorSubject<void>(undefined);\n private pageable$ = new BehaviorSubject<{ pageNumber: number; pageSize: number; sort?: string[] }>({ pageNumber: 0, pageSize: 10 });\n private query$ = new BehaviorSubject<Record<string, any>>({});\n readonly loading$ = new BehaviorSubject<boolean>(false);\n readonly total$ = new BehaviorSubject<number>(0);\n private lastSig = '';\n\n private readonly crud = inject(GenericCrudService as any, {\n optional: true,\n }) as GenericCrudService<T> | null;\n\n setConfig(config: PraxisListConfig): void {\n const sig = JSON.stringify({\n rp: config?.dataSource?.resourcePath || '',\n sort: (config?.dataSource?.sort || []).join(','),\n ps: config?.layout?.pageSize ?? 10,\n q: config?.dataSource?.query ? Object.keys(config.dataSource.query).length : 0,\n });\n const changed = sig !== this.lastSig;\n this.lastSig = sig;\n if (changed) {\n this.config$.next(config);\n const ps = config.layout?.pageSize ?? 10;\n this.pageable$.next({ ...this.pageable$.value, pageNumber: 0, pageSize: ps, sort: config.dataSource?.sort });\n this.query$.next(config.dataSource?.query || {});\n }\n }\n\n refresh(): void {\n this.refresh$.next();\n }\n\n private _stream$?: Observable<T[]>;\n\n stream(): Observable<T[]> {\n if (!this._stream$) {\n this._stream$ = combineLatest([\n this.config$,\n this.pageable$,\n this.query$,\n this.refresh$,\n ]).pipe(\n auditTime(0),\n switchMap(([cfg, pageable, query]) => {\n if (!cfg) return of([]);\n const ds = cfg.dataSource;\n if (ds?.data) {\n this.loading$.next(false);\n this.total$.next((ds.data as T[]).length);\n return of(ds.data as T[]);\n }\n if (ds?.resourcePath && this.crud) {\n try {\n const req: any = { pageNumber: pageable.pageNumber, pageSize: pageable.pageSize };\n if (pageable.sort && pageable.sort.length) req.sort = pageable.sort;\n this.crud.configure(ds.resourcePath);\n console.debug('[PraxisList] fetching via /filter', {\n resourcePath: ds.resourcePath,\n query,\n pageable: req,\n });\n this.loading$.next(true);\n const obs = (this.crud as any)\n .filter(query || {}, req)\n .pipe(\n map((page: any) => {\n const content = (page?.content ?? page ?? []) as T[];\n const total = typeof page?.totalElements === 'number' ? page.totalElements : content.length;\n this.total$.next(total);\n return content;\n }),\n // Fallback: if backend doesn't support /filter for this resource, try GET all\n catchError((err) => {\n console.warn('[PraxisList] /filter failed, falling back to GET all', err);\n return (this.crud as any).getAll().pipe(\n map((arr: T[]) => {\n const content = arr || [];\n this.total$.next(content.length);\n return content;\n }),\n );\n }),\n finalize(() => this.loading$.next(false)),\n );\n return obs as unknown as Observable<T[]>;\n } catch {\n this.loading$.next(false);\n return of([]);\n }\n }\n this.loading$.next(false);\n return of([]);\n }),\n shareReplay(1),\n );\n }\n return this._stream$;\n }\n\n nextPage(): void {\n const p = this.pageable$.value;\n this.pageable$.next({ ...p, pageNumber: p.pageNumber + 1 });\n }\n prevPage(): void {\n const p = this.pageable$.value;\n this.pageable$.next({ ...p, pageNumber: Math.max(0, p.pageNumber - 1) });\n }\n setPageSize(size: number): void {\n const p = this.pageable$.value;\n this.pageable$.next({ ...p, pageSize: Math.max(1, size), pageNumber: 0 });\n }\n setSort(sort: string[]): void {\n const p = this.pageable$.value;\n this.pageable$.next({ ...p, sort, pageNumber: 0 });\n }\n setQuery(q: Record<string, any>): void {\n this.query$.next(q || {});\n }\n\n groupedStream(): Observable<ListSection<T>[]> {\n return this.stream().pipe(\n switchMap((items) =>\n this.config$.pipe(\n map((cfg) => cfg?.layout?.groupBy),\n map((groupBy) => {\n if (!groupBy) return [{ key: undefined, items }];\n const groups = new Map<string, T[]>();\n for (const it of items) {\n const key = (it as any)?.[groupBy];\n const skey = key == null ? '' : String(key);\n if (!groups.has(skey)) groups.set(skey, []);\n groups.get(skey)!.push(it);\n }\n return Array.from(groups.entries()).map(([key, arr]) => ({\n key,\n items: arr,\n }));\n }),\n ),\n ),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { PraxisListConfig } from '../models/list-config.model';\n\n@Injectable({ providedIn: 'root' })\nexport class ListSkinService {\n toHostClasses(config?: PraxisListConfig): string[] {\n const skin = config?.skin?.type || 'elevated';\n const density = config?.layout?.density || 'default';\n const model = config?.layout?.model || 'standard';\n const classes = [\n `skin-${skin}`,\n `density-${density}`,\n `model-${model}`,\n config?.skin?.class || '',\n ].filter(Boolean);\n return classes;\n }\n\n toInlineStyle(config?: PraxisListConfig): string {\n const s = config?.skin;\n if (!s) return '';\n const vars: string[] = [];\n if (s.radius) vars.push(`--p-list-radius: ${s.radius}`);\n if (s.shadow) vars.push(`--p-list-shadow: ${s.shadow}`);\n if (s.border) vars.push(`--p-list-border: ${s.border}`);\n if (s.backdropBlur) vars.push(`--p-list-blur: ${s.backdropBlur}`);\n if (s.gradient?.from) vars.push(`--p-list-grad-from: ${s.gradient.from}`);\n if (s.gradient?.to) vars.push(`--p-list-grad-to: ${s.gradient.to}`);\n if (s.gradient?.angle != null)\n vars.push(`--p-list-grad-angle: ${s.gradient.angle}deg`);\n const base = `:host{${vars.join(';')}}`;\n const extra = sanitizeCss((s.inlineStyle || '').trim());\n return extra ? base + extra : base;\n }\n}\n\nfunction sanitizeCss(css: string): string {\n // Remove padrões e funções de alto risco\n const banned = /(url\\s*\\(|@import|expression\\s*\\(|behavior\\s*\\:)/gi;\n return css.replace(banned, '');\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatListModule } from '@angular/material/list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { PraxisListConfig, TemplateDef } from '../models/list-config.model';\nimport { ListSkinService } from '../services/list-skin.service';\nimport { evaluateTemplate } from '../utils/template-evaluator';\n\n@Component({\n selector: 'praxis-list-skin-preview',\n standalone: true,\n imports: [CommonModule, MatListModule, MatIconModule, MatChipsModule],\n templateUrl: './list-skin-preview.component.html',\n styleUrls: ['./list-skin-preview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PraxisListSkinPreviewComponent {\n @Input() config!: PraxisListConfig;\n @Input() items: any[] = [];\n @Input() theme: 'light'|'dark'|'grid' = 'light';\n\n constructor(private skin: ListSkinService) {}\n\n get skinClasses(): string {\n const base = this.skin.toHostClasses(this.config);\n return [this.themeClass(), ...base].join(' ');\n }\n get inlineCss(): string {\n return this.skin.toInlineStyle(this.config);\n }\n\n themeClass(): string {\n switch (this.theme) {\n case 'dark': return 'preview-dark';\n case 'grid': return 'preview-grid';\n default: return 'preview-light';\n }\n }\n\n isList(): boolean {\n return (this.config?.layout?.variant || 'list') === 'list';\n }\n\n leading = (item: any) => evaluateTemplate(this.config?.templating?.leading, item);\n primary = (item: any) => evaluateTemplate(this.config?.templating?.primary, item);\n secondary = (item: any) => evaluateTemplate(this.config?.templating?.secondary, item);\n meta = (item: any) => evaluateTemplate(this.config?.templating?.meta, item);\n featureLabel(item: any, expr: string): string {\n // simple replacement using the same evaluator used internally\n return String(expr || '').replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n try {\n const value = path.split('.').reduce((acc: any, k: string) => (acc == null ? undefined : acc[k]), { item });\n return value == null ? '' : String(value);\n } catch {\n return '';\n }\n });\n }\n featuresVisible(): boolean {\n const t = this.config?.templating as any;\n const has = (t?.features?.length || 0) > 0;\n const visible = t?.featuresVisible !== false;\n return has && visible;\n }\n featuresMode(): 'icons+labels'|'icons-only'|'labels-only' {\n return ((this.config?.templating as any)?.featuresMode as any) || 'icons+labels';\n }\n\n starIcon(index: number, ratingValue: string | number): string {\n const r = typeof ratingValue === 'number' ? ratingValue : parseFloat(ratingValue || '0');\n const pos = index + 1; // 1..5\n if (r >= pos) return 'star';\n if (r >= pos - 0.5) return 'star_half';\n return 'star_border';\n }\n\n // trackBy for preview lists\n trackByIndex = (i: number) => i;\n}\n","<div class=\"preview-root\" [ngClass]=\"skinClasses\">\n @if (inlineCss) { <style [innerHTML]=\"inlineCss\"></style> }\n\n @if (isList()) {\n <mat-list>\n @for (item of items; track trackByIndex($index)) {\n <mat-list-item>\n <div class=\"list-item-content\">\n @if (leading(item); as lead) {\n @switch (lead.type) {\n @case ('icon') { <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon> }\n @case ('image') {\n <div class=\"lead-image\" [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">\n <img [src]=\"lead.value\" [alt]=\"config.templating?.leading?.imageAlt || ''\" />\n @if (lead.badge?.value) { <mat-chip class=\"lead-badge\" [color]=\"lead.badge?.color || undefined\" [ngClass]=\"(((lead.badge?.variant || 'filled') === 'outlined') ? 'chip-outlined' : '')\">{{ lead.badge?.value }}</mat-chip> }\n </div>\n }\n }\n }\n <div>\n <div class=\"primary\" [ngClass]=\"primary(item)?.class\" [style.cssText]=\"primary(item)?.style\">{{ primary(item)?.value }}</div>\n @if ((config.layout?.lines || 1) > 1) { <div class=\"secondary\" [ngClass]=\"secondary(item)?.class\" [style.cssText]=\"secondary(item)?.style\">{{ secondary(item)?.value }}</div> }\n @if (featuresVisible()) {\n @for (f of (config.templating?.features || []); track $index; let fi = $index) {\n <span class=\"feature\">\n @if (f.icon && featuresMode() !== 'labels-only') { <mat-icon>{{ f.icon }}</mat-icon> }\n @if (featuresMode() !== 'icons-only') { <span [ngClass]=\"f.class\" [style.cssText]=\"f.style\">{{ featureLabel(item, f.expr) }}</span> }\n </span>\n }\n }\n </div>\n @if (meta(item); as m) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip [color]=\"m.color || undefined\" [ngClass]=\"((m.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon>{{ starIcon(idx, m.value) }}</mat-icon> } }\n @default { <span>{{ m.value }}</span> }\n }\n </div>\n }\n </div>\n </mat-list-item>\n }\n </mat-list>\n } @else {\n <div class=\"cards-grid\">\n @for (it of items; track trackByIndex($index)) {\n <div class=\"item-card\">\n <div class=\"list-item-content\">\n @if (leading(it); as lead) {\n @switch (lead.type) {\n @case ('icon') { <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon> }\n @case ('image') {\n <div class=\"lead-image\" [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">\n <img [src]=\"lead.value\" [alt]=\"config.templating?.leading?.imageAlt || ''\" />\n @if (lead.badge?.value) { <mat-chip class=\"lead-badge\" [color]=\"lead.badge?.color || undefined\" [ngClass]=\"(((lead.badge?.variant || 'filled') === 'outlined') ? 'chip-outlined' : '')\">{{ lead.badge?.value }}</mat-chip> }\n </div>\n }\n }\n }\n <div>\n <div class=\"primary\" [ngClass]=\"primary(it)?.class\" [style.cssText]=\"primary(it)?.style\">{{ primary(it)?.value }}</div>\n @if ((config.layout?.lines || 1) > 1) { <div class=\"secondary\" [ngClass]=\"secondary(it)?.class\" [style.cssText]=\"secondary(it)?.style\">{{ secondary(it)?.value }}</div> }\n @if (featuresVisible()) {\n @for (f of (config.templating?.features || []); track $index; let fi = $index) {\n <span class=\"feature\">\n @if (f.icon && featuresMode() !== 'labels-only') { <mat-icon>{{ f.icon }}</mat-icon> }\n @if (featuresMode() !== 'icons-only') { <span [ngClass]=\"f.class\" [style.cssText]=\"f.style\">{{ featureLabel(it, f.expr) }}</span> }\n </span>\n }\n }\n </div>\n @if (meta(it); as m) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip [color]=\"m.color || undefined\" [ngClass]=\"((m.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon>{{ starIcon(idx, m.value) }}</mat-icon> } }\n @default { <span>{{ m.value }}</span> }\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n</div>\n","import { produce } from 'immer';\nimport type { PraxisListConfig, TemplateDef } from '../models/list-config.model';\n\n/**\n * Infer templating slots (primary/secondary/trailing) from field names.\n * - Does not override existing primary if already defined.\n * - Heuristics prioritize Portuguese labels, then common English names.\n */\nexport function inferTemplatingFromSchema(cfg: PraxisListConfig, fieldNames: string[]): PraxisListConfig {\n const names = (fieldNames || []).filter(Boolean);\n if (!names.length) return cfg;\n const templ = cfg.templating || {};\n const needsPrimary = !templ.primary;\n if (!needsPrimary) return cfg; // respect user config\n\n const pickBy = (preds: RegExp[]): string | undefined =>\n names.find((n) => preds.some((p) => p.test(String(n)))) || undefined;\n\n const primaryName =\n pickBy([/nomeCompleto/i, /nome/i, /title/i, /name/i, /label/i]) || names[0];\n const secondaryName =\n names.find((n) => n !== primaryName && /(email|cpf|desc|resumo|cargo|departamento)/i.test(n)) ||\n names.find((n) => n !== primaryName);\n const trailingName = pickBy([/status/i, /tag/i, /state/i, /ativo/i]);\n\n const newCfg = produce(cfg, (draft) => {\n const t: any = { ...(draft.templating as any) };\n t.primary = makeText(primaryName);\n if (secondaryName) {\n t.secondary = makeText(secondaryName);\n draft.layout = draft.layout || ({} as any);\n const cur = Number((draft.layout as any).lines) || 1;\n (draft.layout as any).lines = Math.max(cur, 2) as any;\n }\n if (trailingName) {\n // Use meta for chips to align with current UI (right-side block renders meta).\n t.meta = makeChip(trailingName);\n }\n (draft as any).templating = t;\n });\n return newCfg;\n}\n\nfunction makeText(field: string): TemplateDef {\n return { type: 'text', expr: '${item.' + field + '}' } as any;\n}\nfunction makeChip(field: string): TemplateDef {\n return { type: 'chip', expr: '${item.' + field + '}' } as any;\n}\n","import { Component, Inject, Input, DoCheck, inject } from '@angular/core';\nimport { BehaviorSubject, Subject, of } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, tap, catchError } from 'rxjs/operators';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { PraxisListConfig, TemplateDef } from '../models/list-config.model';\nimport { SETTINGS_PANEL_DATA, SettingsValueProvider } from '@praxisui/settings-panel';\nimport { PraxisListSkinPreviewComponent } from '../components/list-skin-preview.component';\nimport { GenericCrudService, IconPickerService, PraxisIconDirective } from '@praxisui/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { produce } from 'immer';\nimport { inferTemplatingFromSchema } from '../utils/templating-inference';\n\ntype NormalizedListConfig = Omit<\n PraxisListConfig,\n 'dataSource' | 'layout' | 'selection' | 'skin' | 'i18n'\n> & {\n dataSource: { data?: any[]; resourcePath?: string; query?: Record<string, any>; sort?: string[] };\n layout: {\n variant: 'list' | 'cards';\n density?: 'default' | 'comfortable' | 'compact';\n lines: 1 | 2 | 3;\n dividers?: 'none' | 'between' | 'all';\n model?: 'standard' | 'media' | 'hotel';\n groupBy?: string;\n stickySectionHeader?: boolean;\n virtualScroll?: boolean;\n pageSize?: number;\n };\n skin: {\n type: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'custom';\n gradient: { from: string; to: string; angle?: number };\n radius?: string;\n shadow?: string;\n border?: string;\n backdropBlur?: string;\n class?: string;\n inlineStyle?: string;\n };\n selection: {\n mode: 'none' | 'single' | 'multiple';\n formControlName?: string;\n formControlPath?: string;\n compareBy?: string;\n return?: 'value' | 'item' | 'id';\n };\n i18n: { locale?: string; currency?: string };\n actions?: PraxisListConfig['actions'];\n};\n\n@Component({\n selector: 'praxis-list-config-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatTabsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatButtonModule,\n MatSlideToggleModule,\n MatIconModule,\n MatExpansionModule,\n MatButtonToggleModule,\n MatTooltipModule,\n MatDividerModule,\n MatChipsModule,\n PraxisIconDirective,\n PraxisListSkinPreviewComponent,\n ],\n template: `\n <mat-tab-group>\n <mat-tab label=\"Dados\">\n <div class=\"p-3\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>resourcePath</mat-label>\n <input matInput [(ngModel)]=\"working.dataSource.resourcePath\" (ngModelChange)=\"onResourcePathChange($event)\" placeholder=\"ex.: users\" />\n </mat-form-field>\n <div class=\"g g-auto-220 gap-12 ai-end mt-12\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Itens por página</mat-label>\n <input matInput type=\"number\" min=\"1\" [(ngModel)]=\"working.layout.pageSize\" (ngModelChange)=\"onPageSizeChange($event)\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Ordenar por (campo)</mat-label>\n <mat-select [(ngModel)]=\"sortField\" (ngModelChange)=\"updateSortConfig()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Direção</mat-label>\n <mat-select [(ngModel)]=\"sortDir\" (ngModelChange)=\"updateSortConfig()\">\n <mat-option value=\"asc\">Ascendente</mat-option>\n <mat-option value=\"desc\">Descendente</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"Ações\">\n <div class=\"p-3 g gap-12\">\n <div class=\"g g-1-auto gap-8 ai-center\">\n <div class=\"muted\">Configure botões de ação por item (ícone, rótulo, cor, visibilidade)</div>\n <button mat-flat-button color=\"primary\" (click)=\"addAction()\">Adicionar ação</button>\n </div>\n <div *ngFor=\"let a of (working.actions || []); let i = index\" class=\"g g-auto-200 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>ID</mat-label>\n <input matInput [(ngModel)]=\"a.id\" (ngModelChange)=\"onActionsChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"a.kind\" (ngModelChange)=\"onActionsChanged()\">\n <mat-option value=\"icon\">Ícone</mat-option>\n <mat-option value=\"button\">Botão</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone</mat-label>\n <input matInput [(ngModel)]=\"a.icon\" (ngModelChange)=\"onActionsChanged()\" placeholder=\"ex.: edit, delete\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Rótulo</mat-label>\n <input matInput [(ngModel)]=\"a.label\" (ngModelChange)=\"onActionsChanged()\" />\n </mat-form-field>\n <ng-container *ngIf=\"a.kind === 'button'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Variante</mat-label>\n <mat-select [(ngModel)]=\"a.buttonVariant\" (ngModelChange)=\"onActionsChanged()\">\n <mat-option value=\"stroked\">Stroked</mat-option>\n <mat-option value=\"raised\">Raised</mat-option>\n <mat-option value=\"flat\">Flat</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <mat-select [(ngModel)]=\"a.color\" (ngModelChange)=\"onActionsChanged()\">\n <mat-option [value]=\"undefined\">Default</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"col-span-2\">\n <mat-label>Visível quando (ex.: ${item.status} == 'done')</mat-label>\n <input matInput [(ngModel)]=\"a.showIf\" (ngModelChange)=\"onActionsChanged()\" />\n </mat-form-field>\n <div class=\"g row-flow gap-8 ai-center\">\n <button *ngIf=\"(a.kind || 'icon') === 'icon'\" mat-icon-button [color]=\"a.color || undefined\"><mat-icon [praxisIcon]=\"a.icon || 'bolt'\"></mat-icon></button>\n <ng-container *ngIf=\"a.kind === 'button'\">\n <button *ngIf=\"a.buttonVariant === 'stroked'\" mat-stroked-button [color]=\"a.color || undefined\">{{ a.label || a.id || 'Ação' }}</button>\n <button *ngIf=\"a.buttonVariant === 'raised'\" mat-raised-button [color]=\"a.color || undefined\">{{ a.label || a.id || 'Ação' }}</button>\n <button *ngIf=\"!a.buttonVariant || a.buttonVariant === 'flat'\" mat-flat-button [color]=\"a.color || undefined\">{{ a.label || a.id || 'Ação' }}</button>\n </ng-container>\n <span class=\"muted\">Pré-visualização</span>\n </div>\n <div class=\"flex-end\">\n <button mat-button color=\"warn\" (click)=\"removeAction(i)\">Remover</button>\n </div>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"Layout\">\n <div class=\"p-3 grid gap-3\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Variante</mat-label>\n <mat-select [(ngModel)]=\"working.layout.variant\" (ngModelChange)=\"onLayoutChanged()\">\n <mat-option value=\"list\">Lista</mat-option>\n <mat-option value=\"cards\">Cards</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Modelo</mat-label>\n <mat-select [(ngModel)]=\"working.layout.model\" (ngModelChange)=\"onLayoutChanged()\">\n <ng-container *ngIf=\"working.layout.variant === 'list'; else cardModels\">\n <mat-option value=\"standard\">Padrão</mat-option>\n <mat-option value=\"media\">Mídia à esquerda</mat-option>\n <mat-option value=\"hotel\">Hotel (mídia grande)</mat-option>\n </ng-container>\n <ng-template #cardModels>\n <mat-option value=\"standard\">Padrão</mat-option>\n <mat-option value=\"media\">Card com mídia</mat-option>\n <mat-option value=\"hotel\">Hotel</mat-option>\n </ng-template>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Linhas</mat-label>\n <mat-select [(ngModel)]=\"working.layout.lines\" (ngModelChange)=\"onLayoutChanged()\">\n <mat-option [value]=\"1\">1</mat-option>\n <mat-option [value]=\"2\">2</mat-option>\n <mat-option [value]=\"3\">3</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"fields.length > 0; else groupByText\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Group by</mat-label>\n <mat-select [(ngModel)]=\"working.layout.groupBy\" (ngModelChange)=\"onLayoutChanged()\">\n <mat-option [value]=\"\">Nenhum</mat-option>\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #groupByText>\n <mat-form-field appearance=\"outline\">\n <mat-label>Group by</mat-label>\n <input matInput [(ngModel)]=\"working.layout.groupBy\" (ngModelChange)=\"onLayoutChanged()\" placeholder=\"ex.: departamento\" />\n </mat-form-field>\n </ng-template>\n <mat-slide-toggle [(ngModel)]=\"working.layout.stickySectionHeader\" (ngModelChange)=\"onLayoutChanged()\">\n Header de seção sticky\n </mat-slide-toggle>\n </div>\n </mat-tab>\n <mat-tab label=\"Templates\">\n <div class=\"p-3 grid gap-3\">\n <mat-accordion multi>\n <mat-expansion-panel expanded>\n <mat-expansion-panel-header>\n <mat-panel-title>Primary (Título)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Título (primary)</mat-label>\n <mat-select [(ngModel)]=\"mappingPrimary.field\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"mappingPrimary.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"currency\">Moeda</mat-option>\n <mat-option value=\"date\">Data</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingPrimary.type==='currency'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.currencyCode\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingPrimary.type==='date'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Formato</mat-label>\n <mat-select [(ngModel)]=\"mappingPrimary.dateStyle\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"short\">Curto</mat-option>\n <mat-option value=\"medium\">Médio</mat-option>\n <mat-option value=\"long\">Longo</mat-option>\n <mat-option value=\"full\">Completo</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.class\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style inline</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.style\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n </div>\n <mat-divider class=\"my-8\"></mat-divider>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Secondary (Resumo)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Resumo (secondary)</mat-label>\n <mat-select [(ngModel)]=\"mappingSecondary.field\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"mappingSecondary.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"currency\">Moeda</mat-option>\n <mat-option value=\"date\">Data</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingSecondary.type==='currency'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.currencyCode\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingSecondary.type==='date'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Formato</mat-label>\n <mat-select [(ngModel)]=\"mappingSecondary.dateStyle\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"short\">Curto</mat-option>\n <mat-option value=\"medium\">Médio</mat-option>\n <mat-option value=\"long\">Longo</mat-option>\n <mat-option value=\"full\">Completo</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.class\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style inline</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.style\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Meta (lado/detalhe)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Meta</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.field\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"currency\">Moeda</mat-option>\n <mat-option value=\"date\">Data</mat-option>\n <mat-option value=\"chip\">Chip</mat-option>\n <mat-option value=\"rating\">Rating</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingMeta.type==='chip'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do chip</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.chipColor\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option [value]=\"undefined\">Default</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Estilo do chip</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.chipVariant\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"filled\">Preenchido</mat-option>\n <mat-option value=\"outlined\">Contorno</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.class\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style inline</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.style\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição do meta</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.placement\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"side\">Lateral</mat-option>\n <mat-option value=\"line\">Terceira linha</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone do meta (prefixo)</mat-label>\n <input matInput [(ngModel)]=\"mappingMetaPrefixIcon\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: schedule\" />\n <button mat-icon-button color=\"primary\" matSuffix type=\"button\" (click)=\"pickMetaPrefixIcon()\" aria-label=\"Escolher ícone\"><mat-icon>search</mat-icon></button>\n </mat-form-field>\n <ng-container *ngIf=\"mappingMeta.type==='currency'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.currencyCode\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingMeta.type==='date'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Formato</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.dateStyle\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"short\">Curto</mat-option>\n <mat-option value=\"medium\">Médio</mat-option>\n <mat-option value=\"long\">Longo</mat-option>\n <mat-option value=\"full\">Completo</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Trailing (lado direito)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Trailing</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.field\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"chip\">Chip</mat-option>\n <mat-option value=\"currency\">Moeda</mat-option>\n <mat-option value=\"date\">Data</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingTrailing.type==='chip'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do chip</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.chipColor\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option [value]=\"undefined\">Default</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Estilo do chip</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.chipVariant\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"filled\">Preenchido</mat-option>\n <mat-option value=\"outlined\">Contorno</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingTrailing.type==='currency'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.currencyCode\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingTrailing.type==='date'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Formato</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.dateStyle\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"short\">Curto</mat-option>\n <mat-option value=\"medium\">Médio</mat-option>\n <mat-option value=\"long\">Longo</mat-option>\n <mat-option value=\"full\">Completo</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.class\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style inline</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.style\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Leading (ícone/imagem)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Leading</mat-label>\n <mat-select [(ngModel)]=\"mappingLeading.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"icon\">Ícone</mat-option>\n <mat-option value=\"image\">Imagem</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingLeading.type==='icon'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone (leading)</mat-label>\n <input matInput [(ngModel)]=\"mappingLeading.icon\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: face\" />\n <button mat-icon-button color=\"primary\" matSuffix type=\"button\" (click)=\"pickLeadingIcon()\" aria-label=\"Escolher ícone\"><mat-icon>search</mat-icon></button>\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingLeading.type==='image'\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Imagem (URL/expr)</mat-label>\n <input matInput [(ngModel)]=\"mappingLeading.imageUrl\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: \\${item.photoUrl}\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Badge (texto)</mat-label>\n <input matInput [(ngModel)]=\"mappingLeading.badgeText\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: 50% OFF\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do badge</mat-label>\n <mat-select [(ngModel)]=\"mappingLeading.badgeColor\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option [value]=\"undefined\">Default</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Estilo do badge</mat-label>\n <mat-select [(ngModel)]=\"mappingLeading.badgeVariant\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"filled\">Preenchido</mat-option>\n <mat-option value=\"outlined\">Contorno</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Meta e Features (compor + linha)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Campos</mat-label>\n <mat-select [(ngModel)]=\"mappingMetaFields\" (ngModelChange)=\"onMappingChanged()\" multiple>\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Separador</mat-label>\n <input matInput [(ngModel)]=\"mappingMetaSeparator\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: •\" />\n </mat-form-field>\n <mat-slide-toggle [(ngModel)]=\"mappingMetaWrapSecondInParens\" (ngModelChange)=\"onMappingChanged()\">Segundo campo entre parênteses</mat-slide-toggle>\n </div>\n <div class=\"text-caption mt-12\">Ao aplicar, o Meta (texto) usará a expressão composta com os campos selecionados.</div>\n <div class=\"section-title mat-subtitle-1 text-caption subtitle\">Prévia: {{ metaComposePreview() }}</div>\n <div class=\"g row-flow gap-12 ai-center my-8\">\n <button mat-flat-button color=\"primary\" (click)=\"generateFeaturesFromMetaComposition()\" [disabled]=\"!mappingMetaFields.length\">Gerar features a partir do Meta</button>\n <mat-slide-toggle [(ngModel)]=\"featuresSyncWithMeta\" (ngModelChange)=\"onMappingChanged()\">Sincronizar features com Meta</mat-slide-toggle>\n <span class=\"muted\" *ngIf=\"mappingMetaFields.length\">Cria/atualiza uma feature para cada campo composto, com ícone sugerido.</span>\n </div>\n\n <div class=\"section-title mat-subtitle-1 subtitle\">Linha de Features</div>\n <div class=\"g g-1-auto gap-8 ai-center mb-8\">\n <div class=\"g row-flow gap-12 ai-center\">\n <mat-slide-toggle [(ngModel)]=\"featuresVisible\" (ngModelChange)=\"onFeaturesChanged()\">Mostrar features</mat-slide-toggle>\n <mat-button-toggle-group [(ngModel)]=\"featuresMode\" (change)=\"onFeaturesChanged()\" appearance=\"legacy\">\n <mat-button-toggle [value]=\"'icons+labels'\" matTooltip=\"Ícone + texto\"><mat-icon>view_list</mat-icon></mat-button-toggle>\n <mat-button-toggle [value]=\"'icons-only'\" matTooltip=\"Apenas ícones\"><mat-icon>more_horiz</mat-icon></mat-button-toggle>\n <mat-button-toggle [value]=\"'labels-only'\" matTooltip=\"Apenas texto\"><mat-icon>short_text</mat-icon></mat-button-toggle>\n </mat-button-toggle-group>\n <span class=\"muted\" *ngIf=\"featuresSyncWithMeta\">Sincronizado com Meta</span>\n </div>\n <button mat-flat-button color=\"primary\" (click)=\"addFeature()\">Adicionar feature</button>\n </div>\n <div *ngFor=\"let f of features; let i = index\" class=\"g g-auto-200 gap-12 ai-end mb-6\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone</mat-label>\n <input matInput [(ngModel)]=\"f.icon\" (ngModelChange)=\"onFeaturesChanged()\" placeholder=\"ex.: wifi\" />\n <button mat-icon-button color=\"primary\" matSuffix type=\"button\" (click)=\"pickFeatureIcon(i)\" aria-label=\"Escolher ícone\"><mat-icon>search</mat-icon></button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"col-span-2\">\n <mat-label>Rótulo (expressão)</mat-label>\n <input #featureExprInput matInput [(ngModel)]=\"f.expr\" (ngModelChange)=\"onFeaturesChanged()\" placeholder=\"ex.: \\${item.stars}-Star Hotel\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe</mat-label>\n <input matInput [(ngModel)]=\"f.class\" (ngModelChange)=\"onFeaturesChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style</mat-label>\n <input matInput [(ngModel)]=\"f.style\" (ngModelChange)=\"onFeaturesChanged()\" />\n </mat-form-field>\n <div class=\"flex-end\">\n <button mat-button color=\"warn\" (click)=\"removeFeature(i)\">Remover</button>\n </div>\n <div class=\"col-span-3\">\n <div class=\"section-title mat-subtitle-1 text-caption subtitle\">Inserir (Meta selecionado)</div>\n <div class=\"g gap-6 ai-center\">\n <div *ngIf=\"mappingMetaFields.length\" class=\"chips-row\">\n <span class=\"muted text-caption\">Meta selecionado:</span>\n <mat-chip-set aria-label=\"Campos selecionados no Meta\">\n <mat-chip color=\"primary\" selected *ngFor=\"let mf of mappingMetaFields\" (click)=\"insertFeatureToken(i, featureExprInput, mf)\" [matTooltip]=\"'Inserir $' + '{item.' + mf + '}'\">{{ mf }}</mat-chip>\n </mat-chip-set>\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n\n <button mat-flat-button color=\"primary\" (click)=\"applyTemplate()\">Aplicar mapeamento</button>\n <button mat-button (click)=\"inferFromFields()\" [disabled]=\"!fields.length\">Inferir do schema</button>\n </div>\n\n <div class=\"g g-1-auto ai-center\">\n <div class=\"g row-flow gap-8 ai-center\">\n <span class=\"section-title mat-subtitle-1\">Preview Theme</span>\n <mat-button-toggle-group [(ngModel)]=\"skinPreviewTheme\" (change)=\"onSkinChanged()\" appearance=\"legacy\">\n <mat-button-toggle [value]=\"'light'\">Light</mat-button-toggle>\n <mat-button-toggle [value]=\"'dark'\">Dark</mat-button-toggle>\n <mat-button-toggle [value]=\"'grid'\">Grid</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n <div class=\"skin-preview-wrap\">\n <praxis-list-skin-preview [config]=\"working\" [items]=\"previewData\" [theme]=\"skinPreviewTheme\"></praxis-list-skin-preview>\n </div>\n </div>\n \n </mat-tab>\n <mat-tab label=\"i18n/A11y\">\n <div class=\"p-3 grid gap-3\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale padrão</mat-label>\n <input matInput [(ngModel)]=\"working.i18n.locale\" (ngModelChange)=\"markDirty()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda padrão</mat-label>\n <input matInput [(ngModel)]=\"working.i18n.currency\" (ngModelChange)=\"markDirty()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab label=\"Seleção\">\n <div class=\"p-3 grid gap-3\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Modo</mat-label>\n <mat-select [(ngModel)]=\"working.selection.mode\" (ngModelChange)=\"onSelectionChanged()\">\n <mat-option value=\"none\">Sem seleção</mat-option>\n <mat-option value=\"single\">Single</mat-option>\n <mat-option value=\"multiple\">Multiple</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>FormControl name</mat-label>\n <input matInput [(ngModel)]=\"working.selection.formControlName\" (ngModelChange)=\"onSelectionChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>compareBy</mat-label>\n <input matInput [(ngModel)]=\"working.selection.compareBy\" (ngModelChange)=\"onSelectionChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Retorno</mat-label>\n <mat-select [(ngModel)]=\"working.selection.return\" (ngModelChange)=\"onSelectionChanged()\">\n <mat-option value=\"value\">value</mat-option>\n <mat-option value=\"item\">item</mat-option>\n <mat-option value=\"id\">id</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab label=\"Skins\">\n <div class=\"p-3 grid gap-3\">\n <div class=\"preset-row g row-flow gap-8\">\n <button mat-button (click)=\"applySkinPreset('pill-soft')\">Pill Soft</button>\n <button mat-button (click)=\"applySkinPreset('gradient-tile')\">Gradient Tile</button>\n <button mat-button (click)=\"applySkinPreset('glass')\">Glass</button>\n <button mat-button (click)=\"applySkinPreset('elevated')\">Elevated</button>\n <button mat-button (click)=\"applySkinPreset('outline')\">Outline</button>\n <button mat-button (click)=\"applySkinPreset('flat')\">Flat</button>\n <button mat-button (click)=\"applySkinPreset('neumorphism')\">Neumorphism</button>\n </div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Skin</mat-label>\n <mat-select [(ngModel)]=\"working.skin.type\" (ngModelChange)=\"onSkinChanged()\">\n <mat-option value=\"pill-soft\">Pill Soft</mat-option>\n <mat-option value=\"gradient-tile\">Gradient Tile</mat-option>\n <mat-option value=\"glass\">Glass</mat-option>\n <mat-option value=\"elevated\">Elevated</mat-option>\n <mat-option value=\"custom\">Custom</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Radius</mat-label>\n <input matInput [(ngModel)]=\"working.skin.radius\" (ngModelChange)=\"onSkinChanged()\" placeholder=\"ex.: 1.25rem\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Shadow</mat-label>\n <input matInput [(ngModel)]=\"working.skin.shadow\" (ngModelChange)=\"onSkinChanged()\" placeholder=\"ex.: 0 10px 30px rgba(0,0,0,.12)\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Border</mat-label>\n <input matInput [(ngModel)]=\"working.skin.border\" (ngModelChange)=\"onSkinChanged()\" />\n </mat-form-field>\n <mat-form-field *ngIf=\"working.skin.type==='glass'\" appearance=\"outline\">\n <mat-label>Blur</mat-label>\n <input matInput [(ngModel)]=\"working.skin.backdropBlur\" (ngModelChange)=\"onSkinChanged()\" placeholder=\"e.g. 8px\" />\n </mat-form-field>\n <div *ngIf=\"working.skin.type==='gradient-tile'\" class=\"g gap-12\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Gradient from</mat-label>\n <input matInput [(ngModel)]=\"working.skin.gradient.from\" (ngModelChange)=\"onSkinChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Gradient to</mat-label>\n <input matInput [(ngModel)]=\"working.skin.gradient.to\" (ngModelChange)=\"onSkinChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Angle</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"working.skin.gradient.angle\" (ngModelChange)=\"onSkinChanged()\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"working.skin.type==='custom'\" class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS (skin.class)</mat-label>\n <input matInput [(ngModel)]=\"working.skin.class\" (ngModelChange)=\"onSkinChanged()\" placeholder=\"ex.: my-list-skin\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Style inline (skin.inlineStyle)</mat-label>\n <textarea matInput rows=\"4\" [(ngModel)]=\"working.skin.inlineStyle\" (ngModelChange)=\"onSkinChanged()\" [attr.placeholder]=\"':host{--p-list-radius: 1rem}'\"></textarea>\n </mat-form-field>\n <div class=\"text-caption\">\n Exemplo de CSS por classe (adicione no seu styles global):\n <pre class=\"code-block\">.my-list-skin .item-card {\n border-radius: 14px;\n border: 1px solid rgba(0,0,0,.12);\n box-shadow: 0 10px 24px rgba(0,0,0,.12);\n}\n.my-list-skin .mat-mdc-list-item .list-item-content {\n backdrop-filter: blur(6px);\n}</pre>\n </div>\n </div>\n\n \n </div>\n </mat-tab>\n </mat-tab-group>\n `,\n styles: [`\n .g{display:grid}\n .g-auto-220{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}\n .g-auto-200{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}\n .g-1-auto{grid-template-columns:1fr auto}\n .row-flow{grid-auto-flow:column}\n .gap-6{gap:6px}\n .gap-8{gap:8px}\n .gap-12{gap:12px}\n .ai-center{align-items:center}\n .ai-end{align-items:end}\n .mt-12{margin-top:12px}\n .mb-8{margin-bottom:8px}\n .mb-6{margin-bottom:6px}\n .my-8{margin:8px 0}\n .subtitle{margin:8px 0 4px;opacity:.82}\n .chips-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center}\n `]\n})\nexport class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {\n @Input() config!: PraxisListConfig;\n @Input() listId?: string;\n\n working: NormalizedListConfig = {\n dataSource: {},\n layout: { variant: 'list', lines: 2, density: 'default', dividers: 'between' },\n selection: { mode: 'none', return: 'value' },\n skin: { type: 'elevated', gradient: { from: '', to: '', angle: 135 } },\n i18n: { locale: 'en-US', currency: 'USD' },\n };\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(true);\n isBusy$ = new BehaviorSubject<boolean>(false);\n\n private initialJson = '';\n private lastJson = '';\n\n fields: string[] = [];\n private lastResourcePath?: string; // kept for backwards safety; watcher supersedes\n sortField?: string;\n sortDir: 'asc' | 'desc' = 'asc';\n mappingPrimary: { field?: string; type: 'text'|'currency'|'date'; currencyCode?: string; locale?: string; dateStyle?: 'short'|'medium'|'long'|'full'; class?: string; style?: string } = { type: 'text' } as any;\n mappingSecondary: { field?: string; type: 'text'|'currency'|'date'; currencyCode?: string; locale?: string; dateStyle?: 'short'|'medium'|'long'|'full'; class?: string; style?: string } = { type: 'text' } as any;\n mappingMeta: { field?: string; type: 'text'|'currency'|'date'|'chip'|'rating'; currencyCode?: string; locale?: string; dateStyle?: 'short'|'medium'|'long'|'full'; class?: string; style?: string; placement?: 'side'|'line'; chipColor?: string; chipVariant?: 'filled'|'outlined' } = { type: 'text' } as any;\n mappingMetaPrefixIcon?: string;\n mappingTrailing: { field?: string; type?: 'text'|'currency'|'date'|'chip'; class?: string; style?: string; chipColor?: string; chipVariant?: 'filled'|'outlined'; currencyCode?: string; locale?: string; dateStyle?: 'short'|'medium'|'long'|'full' } = {} as any;\n mappingLeading: { type: 'icon'|'image'; icon?: string; imageUrl?: string; badgeText?: string; badgeColor?: string; badgeVariant?: 'filled'|'outlined' } = { type: 'icon' } as any;\n mapping: { leadingIcon?: string } = {};\n private mappingDirty = false;\n\n // Meta composition (multi-field)\n mappingMetaFields: string[] = [];\n mappingMetaSeparator: string = ' • ';\n mappingMetaWrapSecondInParens = false;\n featuresSyncWithMeta = false;\n\n // Features editor state\n features: Array<{ icon?: string; expr: string; class?: string; style?: string }> = [];\n featuresVisible = true;\n featuresMode: 'icons+labels'|'icons-only'|'labels-only' = 'icons+labels';\n\n private crud: GenericCrudService<any> | null = null;\n private resourcePathChanges = new Subject<string>();\n\n constructor(@Inject(SETTINGS_PANEL_DATA) injected?: any) {\n // optional inject\n this.crud = inject(GenericCrudService as any, { optional: true }) as GenericCrudService<any> | null;\n const cfg = (injected?.config as PraxisListConfig) || this.config;\n if (cfg) {\n this.working = this.normalize(structuredClone(cfg));\n // Initialize mapping UI from existing templating\n this.hydrateMappingFromTemplating(this.working.templating as any);\n }\n this.initialJson = JSON.stringify(this.working);\n this.lastJson = this.initialJson;\n // Start schema watcher and emit initial value\n this.setupSchemaWatcher();\n this.resourcePathChanges.next(this.working?.dataSource?.resourcePath || '');\n // Hydrate sort controls from existing config\n const sort = this.working.dataSource?.sort?.[0];\n if (sort && typeof sort === 'string') {\n const [field, dir] = sort.split(',');\n this.sortField = field;\n this.sortDir = (dir === 'desc' ? 'desc' : 'asc');\n }\n }\n\n private ip = inject(IconPickerService);\n async pickLeadingIcon(): Promise<void> {\n const chosen = await this.ip.openDialog({ value: (this.mappingLeading as any)?.icon });\n if (chosen == null) return;\n this.mappingLeading = { ...(this.mappingLeading || { type: 'icon' as const }), type: 'icon', icon: chosen } as any;\n this.onMappingChanged();\n }\n async pickFeatureIcon(index: number): Promise<void> {\n const current = (this.features?.[index]?.icon) || '';\n const chosen = await this.ip.openDialog({ value: current });\n if (chosen == null) return;\n const arr = [...(this.features || [])];\n const old = arr[index] || { icon: '', expr: '' };\n arr[index] = { ...old, icon: chosen };\n this.features = arr;\n this.onFeaturesChanged();\n }\n async pickMetaPrefixIcon(): Promise<void> {\n const chosen = await this.ip.openDialog({ value: this.mappingMetaPrefixIcon || '' });\n if (chosen == null) return;\n this.mappingMetaPrefixIcon = chosen;\n this.onMappingChanged();\n }\n\n getSettingsValue(): any {\n // Ensure pending template mapping is applied before returning\n this.ensureMappingApplied();\n return { config: this.working, id: this.listId };\n }\n\n onSave(): any {\n this.ensureMappingApplied();\n return { config: this.working, id: this.listId };\n }\n\n private normalize(cfg: PraxisListConfig): NormalizedListConfig {\n const out: NormalizedListConfig = {\n ...cfg,\n dataSource: cfg.dataSource || {},\n layout: {\n variant: (cfg.layout?.variant as any) || 'list',\n lines: (cfg.layout?.lines as any) || 2,\n density: cfg.layout?.density || 'default',\n dividers: cfg.layout?.dividers || 'between',\n model: (cfg.layout?.model as any) || 'standard',\n groupBy: cfg.layout?.groupBy,\n stickySectionHeader: cfg.layout?.stickySectionHeader,\n virtualScroll: cfg.layout?.virtualScroll,\n },\n selection: {\n mode: cfg.selection?.mode || 'none',\n formControlName: cfg.selection?.formControlName,\n formControlPath: cfg.selection?.formControlPath,\n compareBy: cfg.selection?.compareBy,\n return: cfg.selection?.return || 'value',\n },\n skin: {\n type: (cfg.skin?.type as any) || 'elevated',\n gradient: cfg.skin?.gradient || { from: '', to: '', angle: 135 },\n radius: cfg.skin?.radius,\n shadow: cfg.skin?.shadow,\n border: cfg.skin?.border,\n backdropBlur: cfg.skin?.backdropBlur,\n class: cfg.skin?.class,\n },\n i18n: (cfg.i18n as any) || {},\n };\n return out;\n }\n\n // Debounced schema loader for resourcePath\n private setupSchemaWatcher(): void {\n this.resourcePathChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n tap(() => this.isBusy$.next(true)),\n switchMap((rp) => {\n const path = (rp || '').trim();\n if (!path || !this.crud) {\n this.fields = [];\n return of([]);\n }\n try {\n this.crud.configure(path);\n return this.crud.getSchema().pipe(catchError(() => of([])));\n } catch {\n return of([]);\n }\n }),\n takeUntilDestroyed(),\n )\n .subscribe((fields: any) => {\n this.fields = (fields || [])\n .map((f: any) => f?.name || f?.field || f?.key)\n .filter((n: any) => !!n) as string[];\n this.isBusy$.next(false);\n this.verify();\n });\n }\n\n onResourcePathChange(value: string): void {\n this.resourcePathChanges.next(value ?? '');\n this.markDirty();\n this.verify();\n }\n\n applySkinPreset(preset: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'outline' | 'flat' | 'neumorphism'): void {\n const currentClass = this.working?.skin?.class;\n this.working = produce(this.working, (draft) => {\n switch (preset) {\n case 'pill-soft':\n draft.skin = {\n type: 'pill-soft',\n radius: '1.5rem',\n shadow: '0 6px 20px rgba(0,0,0,0.08)',\n border: '1px solid rgba(0,0,0,0.06)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'gradient-tile':\n draft.skin = {\n type: 'gradient-tile',\n gradient: { from: '#FFAA70', to: '#8E72FF', angle: 135 },\n radius: '1rem',\n shadow: '0 10px 30px rgba(0,0,0,0.12)',\n class: currentClass,\n } as any;\n break;\n case 'glass':\n draft.skin = {\n type: 'glass',\n radius: '1rem',\n border: '1px solid rgba(255,255,255,0.33)',\n backdropBlur: '12px',\n shadow: '0 6px 20px rgba(0,0,0,0.08)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'elevated':\n default:\n draft.skin = {\n type: 'elevated',\n radius: '0.75rem',\n shadow: '0 6px 20px rgba(0,0,0,0.08)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'outline':\n draft.skin = {\n type: 'elevated',\n radius: '0.75rem',\n shadow: 'none',\n border: '1px solid rgba(0,0,0,0.2)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'flat':\n draft.skin = {\n type: 'elevated',\n radius: '0.5rem',\n shadow: 'none',\n border: '1px solid rgba(0,0,0,0.08)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'neumorphism':\n draft.skin = {\n type: 'elevated',\n radius: '1.25rem',\n shadow: '8px 8px 20px rgba(0,0,0,0.08), -8px -8px 20px rgba(255,255,255,0.6)',\n border: '1px solid rgba(255,255,255,0.35)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n }\n });\n this.markDirty();\n this.verify();\n }\n\n previewData = [\n { title: 'Maria', subtitle: 'Product Designer', tag: 'A+', salary: 12345.67, hireDate: '2022-03-01', rating: 4.5 },\n { title: 'João', subtitle: 'Frontend Engineer', tag: 'B', salary: 9876.0, hireDate: '2023-01-12', rating: 3.8 },\n { title: 'Ana', subtitle: 'QA Analyst', tag: 'C', salary: 7564.32, hireDate: '2021-10-05', rating: 4.9 },\n ];\n skinPreviewTheme: 'light'|'dark'|'grid' = 'light';\n\n addAction(): void {\n this.working = produce(this.working, (draft: any) => {\n draft.actions = draft.actions || [];\n draft.actions.push({ id: 'newAction', icon: 'bolt', label: 'Ação', color: undefined, kind: 'icon' });\n });\n this.markDirty();\n this.verify();\n }\n removeAction(idx: number): void {\n this.working = produce(this.working, (draft: any) => {\n if (Array.isArray(draft.actions)) draft.actions.splice(idx, 1);\n });\n this.markDirty();\n this.verify();\n }\n onActionsChanged(): void {\n this.markDirty();\n this.verify();\n }\n\n ngDoCheck(): void {\n // Lightweight dirty tracking relying on lastJson updated by markDirty()\n // Leave empty to avoid heavy work each CD; explicit mutation handlers call markDirty() and verify().\n }\n\n reset(): void {\n try {\n this.isBusy$.next(true);\n const parsed = JSON.parse(this.initialJson);\n this.working = parsed;\n this.lastJson = this.initialJson;\n this.isDirty$.next(false);\n this.isValid$.next(true);\n } finally {\n this.isBusy$.next(false);\n }\n }\n\n onLayoutChanged(): void {\n this.markDirty();\n this.verify();\n }\n\n onSelectionChanged(): void {\n this.markDirty();\n this.verify();\n }\n\n onSkinChanged(): void {\n this.markDirty();\n }\n\n onPageSizeChange(value: any): void {\n const n = Number(value);\n const fixed = !Number.isFinite(n) || n < 1 ? 1 : Math.floor(n);\n this.working = produce(this.working, (draft) => {\n (draft.layout as any).pageSize = fixed;\n });\n this.markDirty();\n this.verify();\n }\n\n // Legacy method retained to avoid breaking references; no-op now.\n private loadFieldsIfNeeded(): void { /* replaced by setupSchemaWatcher */ }\n\n updateSortConfig(): void {\n const field = (this.sortField || '').trim();\n const dir = this.sortDir || 'asc';\n this.working = produce(this.working, (draft) => {\n draft.dataSource = draft.dataSource || ({} as any);\n if (field) draft.dataSource.sort = [`${field},${dir}`];\n else (draft.dataSource as any).sort = undefined as any;\n });\n this.markDirty();\n this.verify();\n }\n\n applyTemplate(): void {\n const t: any = { ...(this.working.templating as any) };\n const build = (slot: any): TemplateDef | undefined => {\n if (!slot?.field) return undefined;\n const base = '${item.' + slot.field + '}';\n if (slot.type === 'text') return { type: 'text', expr: base, class: slot.class, style: slot.style } as any;\n if (slot.type === 'chip') return { type: 'chip', expr: base, class: slot.class, style: slot.style, color: slot.chipColor, variant: slot.chipVariant } as any;\n if (slot.type === 'rating') return { type: 'rating', expr: base, class: slot.class, style: slot.style } as any;\n if (slot.type === 'currency') {\n const code = slot.currencyCode?.trim();\n const loc = slot.locale?.trim();\n const param = code ? (loc ? code + ':' + loc : code) : '';\n return { type: 'currency', expr: param ? base + '|' + param : base, class: slot.class, style: slot.style } as any;\n }\n if (slot.type === 'date') {\n const loc = slot.locale?.trim();\n const style = slot.dateStyle?.trim();\n let param = '';\n if (loc && style) param = loc + ':' + style;\n else if (loc) param = loc;\n else if (style) param = ':' + style;\n return { type: 'date', expr: param ? base + '|' + param : base, class: slot.class, style: slot.style } as any;\n }\n return undefined;\n };\n\n const p = build(this.mappingPrimary);\n const s = build(this.mappingSecondary);\n const m = build(this.mappingMeta);\n const tr = this.mappingTrailing.field ? build(this.mappingTrailing) : undefined;\n\n if (p) t.primary = p;\n if (s) {\n t.secondary = s;\n // Garantir que a UI tenha espaço para exibir o secondary\n const currentLines = Number(this.working.layout.lines as any) || 1;\n if (currentLines < 2) this.working.layout.lines = 2 as any;\n }\n if ((this.mappingMeta?.type || 'text') === 'text' && this.mappingMetaFields && this.mappingMetaFields.length) {\n const parts = this.mappingMetaFields.map((f, idx) => {\n const token = '${item.' + f + '}';\n if (idx === 1 && this.mappingMetaWrapSecondInParens) return '(' + token + ')';\n return token;\n });\n const sep = this.mappingMetaSeparator ?? ' ';\n t.meta = { type: 'text', expr: parts.join(sep), class: this.mappingMeta.class, style: this.mappingMeta.style } as any;\n } else if (m) {\n t.meta = m;\n }\n if (tr) t.trailing = tr;\n if (this.mappingLeading?.type === 'icon' && this.mappingLeading.icon && this.mappingLeading.icon.trim()) {\n t.leading = { type: 'icon', expr: this.mappingLeading.icon.trim() } as TemplateDef;\n }\n if (this.mappingLeading?.type === 'image' && this.mappingLeading.imageUrl && this.mappingLeading.imageUrl.trim()) {\n t.leading = {\n type: 'image',\n expr: this.mappingLeading.imageUrl.trim(),\n badge: this.mappingLeading.badgeText ? {\n expr: this.mappingLeading.badgeText,\n color: this.mappingLeading.badgeColor as any,\n variant: (this.mappingLeading.badgeVariant as any) || 'filled',\n } : undefined,\n } as any;\n }\n\n if (this.mappingMeta?.placement) {\n (t as any).metaPlacement = this.mappingMeta.placement;\n }\n (t as any).metaPrefixIcon = (this.mappingMetaPrefixIcon || '').trim() || undefined;\n // Apply features\n if (this.features && this.features.length) {\n t.features = this.features\n .filter(f => (f.expr || '').trim().length > 0)\n .map(f => ({ icon: f.icon, expr: f.expr, class: f.class, style: f.style }));\n } else {\n t.features = undefined as any;\n }\n (t as any).featuresVisible = this.featuresVisible;\n (t as any).featuresMode = this.featuresMode;\n\n this.working = produce(this.working, (draft) => {\n (draft as any).templating = t;\n });\n this.markDirty();\n this.verify();\n this.mappingDirty = false;\n }\n\n private ensureMappingApplied(): void {\n if (this.mappingDirty) {\n this.applyTemplate();\n }\n }\n\n onMappingChanged(): void {\n this.mappingDirty = true;\n this.isDirty$.next(true);\n if (this.featuresSyncWithMeta) {\n this.generateFeaturesFromMetaComposition();\n }\n this.verify();\n }\n\n addFeature(): void {\n this.features = [...(this.features || []), { icon: '', expr: '' }];\n this.onFeaturesChanged();\n }\n removeFeature(idx: number): void {\n const arr = [...(this.features || [])];\n arr.splice(idx, 1);\n this.features = arr;\n this.onFeaturesChanged();\n }\n onFeaturesChanged(): void {\n this.mappingDirty = true;\n this.isDirty$.next(true);\n }\n\n // ===============\n // Expr helpers (Features): click-to-insert fields and literals\n // ===============\n insertFeatureToken(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, field: string): void {\n const token = '${item.' + field + '}';\n this.insertIntoFeatureExpr(index, inputEl, token);\n }\n insertLiteralAt(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, text: string): void {\n this.insertIntoFeatureExpr(index, inputEl, text);\n }\n wrapSelectionAt(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, left: string, right: string): void {\n const start = inputEl.selectionStart ?? inputEl.value.length;\n const end = inputEl.selectionEnd ?? start;\n const value = this.features[index]?.expr || '';\n const before = value.slice(0, start);\n const sel = value.slice(start, end);\n const after = value.slice(end);\n const newExpr = before + left + sel + right + after;\n this.updateFeatureExpr(index, inputEl, newExpr, start + left.length + sel.length + right.length);\n }\n private insertIntoFeatureExpr(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, text: string): void {\n const start = inputEl.selectionStart ?? inputEl.value.length;\n const end = inputEl.selectionEnd ?? start;\n const value = this.features[index]?.expr || '';\n const newExpr = value.slice(0, start) + text + value.slice(end);\n const newCaret = start + text.length;\n this.updateFeatureExpr(index, inputEl, newExpr, newCaret);\n }\n private updateFeatureExpr(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, newExpr: string, caretPos: number): void {\n const arr = [...(this.features || [])];\n const old = arr[index] || { icon: '', expr: '' };\n arr[index] = { ...old, expr: newExpr };\n this.features = arr;\n this.onFeaturesChanged();\n // restore caret\n setTimeout(() => {\n try {\n inputEl.focus();\n inputEl.selectionStart = caretPos;\n inputEl.selectionEnd = caretPos;\n } catch {}\n });\n }\n // no-op helper intentionally removed (index is provided explicitly by the template)\n\n private hydrateMappingFromTemplating(templ?: any): void {\n if (!templ) return;\n const parseExpr = (expr?: string): { field?: string; param?: string } => {\n if (!expr) return {};\n const [base, param] = expr.split('|').map((s) => s.trim());\n const m = base.match(/\\$\\{\\s*item\\.([^}]+)\\s*}/);\n return { field: m?.[1], param };\n };\n const parseCurrency = (param?: string): { currencyCode?: string; locale?: string } => {\n if (!param) return {};\n const [code, loc] = param.split(':').map((s) => s?.trim()).filter(Boolean) as string[];\n return { currencyCode: code, locale: loc };\n };\n const parseDate = (param?: string): { locale?: string; dateStyle?: any } => {\n if (!param) return {} as any;\n const [p1, p2] = param.split(':').map((s) => s?.trim());\n if (p1 && p2) return { locale: p1, dateStyle: p2 as any };\n if (p1 && !p2 && /^(short|medium|long|full)$/i.test(p1)) return { dateStyle: p1 as any };\n return { locale: p1 } as any;\n };\n\n if (templ.primary) {\n const { field, param } = parseExpr(templ.primary.expr);\n const base: any = { field, type: templ.primary.type || 'text', class: templ.primary.class, style: templ.primary.style };\n if (templ.primary.type === 'currency') Object.assign(base, parseCurrency(param));\n if (templ.primary.type === 'date') Object.assign(base, parseDate(param));\n this.mappingPrimary = base;\n }\n if (templ.secondary) {\n const { field, param } = parseExpr(templ.secondary.expr);\n const base: any = { field, type: templ.secondary.type || 'text', class: templ.secondary.class, style: templ.secondary.style };\n if (templ.secondary.type === 'currency') Object.assign(base, parseCurrency(param));\n if (templ.secondary.type === 'date') Object.assign(base, parseDate(param));\n this.mappingSecondary = base;\n }\n if (templ.meta) {\n const { field, param } = parseExpr(templ.meta.expr);\n const base: any = { field, type: templ.meta.type || 'text', class: templ.meta.class, style: templ.meta.style };\n if (templ.meta.type === 'currency') Object.assign(base, parseCurrency(param));\n if (templ.meta.type === 'date') Object.assign(base, parseDate(param));\n this.mappingMeta = base;\n if (templ.metaPlacement) this.mappingMeta.placement = templ.metaPlacement;\n if ((templ as any).metaPrefixIcon) this.mappingMetaPrefixIcon = (templ as any).metaPrefixIcon;\n if (templ.meta?.color) this.mappingMeta.chipColor = templ.meta.color;\n if (templ.meta?.variant) this.mappingMeta.chipVariant = templ.meta.variant;\n // Try to detect composed text: split by common separators if it contains ${item.\n if (typeof templ.meta?.expr === 'string' && /\\$\\{\\s*item\\./.test(templ.meta.expr)) {\n const guessSep = / • /.test(templ.meta.expr) ? ' • ' : (/,\\s*/.test(templ.meta.expr) ? ', ' : ' ');\n const matches = Array.from(templ.meta.expr.matchAll(/\\$\\{\\s*item\\.([^}]+)\\s*}/g)).map((m: any) => m[1] as string);\n if (matches.length >= 2) {\n this.mappingMetaFields = matches as any;\n this.mappingMetaSeparator = guessSep as any;\n this.mappingMetaWrapSecondInParens = /\\(\\s*\\$\\{\\s*item\\.[^}]+\\}\\s*\\)/.test(templ.meta.expr);\n }\n }\n }\n if (templ.trailing) {\n const { field, param } = parseExpr(templ.trailing.expr);\n const base: any = { field, type: templ.trailing.type || 'text', class: templ.trailing.class, style: templ.trailing.style };\n if (templ.trailing.type === 'currency') Object.assign(base, parseCurrency(param));\n if (templ.trailing.type === 'date') Object.assign(base, parseDate(param));\n this.mappingTrailing = base;\n if (templ.trailing?.color) this.mappingTrailing.chipColor = templ.trailing.color;\n if (templ.trailing?.variant) this.mappingTrailing.chipVariant = templ.trailing.variant;\n }\n if (templ.leading?.type === 'icon' && typeof templ.leading.expr === 'string') {\n this.mappingLeading = { type: 'icon', icon: templ.leading.expr } as any;\n } else if (templ.leading?.type === 'image' && typeof templ.leading.expr === 'string') {\n this.mappingLeading = {\n type: 'image',\n imageUrl: templ.leading.expr,\n badgeText: templ.leading?.badge?.expr,\n badgeColor: templ.leading?.badge?.color,\n badgeVariant: templ.leading?.badge?.variant,\n } as any;\n }\n\n if (Array.isArray(templ.features)) {\n this.features = templ.features.map((f: any) => ({ icon: f.icon, expr: f.expr, class: f.class, style: f.style }));\n }\n this.featuresVisible = templ.featuresVisible !== false;\n this.featuresMode = (templ.featuresMode as any) || 'icons+labels';\n }\n\n markDirty(): void {\n const current = JSON.stringify(this.working);\n this.lastJson = current;\n this.isDirty$.next(current !== this.initialJson);\n }\n verify(): void {\n // Basic constraints\n const rp = (this.working?.dataSource?.resourcePath || '').trim();\n const pageSizeRaw = (this.working?.layout?.pageSize as any);\n const pageSizeNum = pageSizeRaw == null ? undefined : Number(pageSizeRaw);\n const lines = this.working?.layout?.lines as any;\n const sortField = (this.sortField || '').trim();\n\n let valid = true;\n if (!rp) valid = false;\n if (pageSizeNum != null && (!Number.isFinite(pageSizeNum) || pageSizeNum < 1)) valid = false;\n if (![1, 2, 3].includes(Number(lines))) valid = false;\n if (sortField && this.fields.length && !this.fields.includes(sortField)) valid = false;\n\n // selection.compareBy should exist when fields are loaded\n const compareBy = (this.working?.selection?.compareBy || '').trim();\n if (compareBy && this.fields.length && !this.fields.includes(compareBy)) valid = false;\n\n this.isValid$.next(valid);\n }\n\n inferFromFields(): void {\n if (!this.fields?.length) return;\n const updated = inferTemplatingFromSchema(this.working as any, this.fields);\n this.working = updated as any;\n // Keep mapping controls in sync with new templating\n this.hydrateMappingFromTemplating((this.working as any).templating);\n this.markDirty();\n this.verify();\n }\n\n // Generate Features from Meta composition\n generateFeaturesFromMetaComposition(): void {\n const fields = (this.mappingMetaFields || []).filter(Boolean);\n if (!fields.length) return;\n const created = fields.map((f) => ({ icon: this.suggestIcon(f), expr: '${item.' + f + '}' }));\n const existing = [...(this.features || [])];\n for (const nf of created) {\n const idx = existing.findIndex((x) => (x.expr || '').trim() === nf.expr);\n if (idx >= 0) {\n // update icon if missing\n if (!existing[idx].icon && nf.icon) existing[idx].icon = nf.icon;\n } else {\n existing.push(nf);\n }\n }\n this.features = existing;\n this.featuresVisible = true;\n this.featuresMode = this.featuresMode || 'icons+labels';\n this.onFeaturesChanged();\n }\n metaComposePreview(): string {\n if (!this.mappingMetaFields?.length) return '';\n const parts = this.mappingMetaFields.map((f, idx) => {\n const token = '${item.' + f + '}';\n if (idx === 1 && this.mappingMetaWrapSecondInParens) return '(' + token + ')';\n return token;\n });\n const sep = this.mappingMetaSeparator ?? ' ';\n return parts.join(sep);\n }\n private suggestIcon(field: string): string {\n const f = (field || '').toLowerCase();\n if (/(price|amount|value|total|cost|salary)/.test(f)) return 'attach_money';\n if (/(date|time|day|hour)/.test(f)) return 'schedule';\n if (/(star|rating|score)/.test(f)) return 'star';\n if (/city/.test(f)) return 'location_city';\n if (/(country|nation|world)/.test(f)) return 'public';\n if (/(location|address)/.test(f)) return 'location_on';\n if (/status/.test(f)) return 'info';\n if (/(tag|label)/.test(f)) return 'label';\n if (/email/.test(f)) return 'mail';\n if (/(phone|mobile|cell)/.test(f)) return 'call';\n return '';\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatListModule, MatSelectionListChange } from '@angular/material/list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport {\n PraxisListConfig,\n ListItemEvent,\n ListActionEvent,\n ListSelectionEvent,\n} from '../models/list-config.model';\nimport { evaluateTemplate } from '../utils/template-evaluator';\nimport { adaptSelection } from '../utils/selection-adapter';\nimport { ListDataService } from '../services/list-data.service';\nimport type { ListSection } from '../services/list-data.service';\nimport { ListSkinService } from '../services/list-skin.service';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport { CONFIG_STORAGE, ConfigStorage, GenericCrudService } from '@praxisui/core';\nimport { PraxisListConfigEditor } from '../editors/list-config-editor.component';\nimport { inferTemplatingFromSchema } from '../utils/templating-inference';\n\n@Component({\n selector: 'praxis-list',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatListModule,\n MatDividerModule,\n MatIconModule,\n PraxisIconDirective,\n MatChipsModule,\n MatButtonModule,\n ],\n templateUrl: './praxis-list.component.html',\n styleUrls: ['./praxis-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [GenericCrudService, ListDataService],\n})\nexport class PraxisList implements OnInit, OnChanges {\n @Input() config!: PraxisListConfig;\n @Input() form?: FormGroup | null;\n\n @Output() itemClick = new EventEmitter<ListItemEvent>();\n @Output() actionClick = new EventEmitter<ListActionEvent>();\n @Output() selectionChange = new EventEmitter<ListSelectionEvent>();\n\n items$!: import('rxjs').Observable<any[]>;\n sections$!: import('rxjs').Observable<ListSection<any>[]>;\n loading$!: import('rxjs').Observable<boolean>;\n total$!: import('rxjs').Observable<number>;\n get layoutLines(): number {\n return this.config?.layout?.lines ?? 2;\n }\n\n boundControl: FormControl<unknown | unknown[] | null> = new FormControl<\n unknown | unknown[] | null\n >(null);\n skinClasses = '';\n inlineCss = '';\n\n private readonly storage = inject(CONFIG_STORAGE);\n private readonly skin = inject(ListSkinService);\n private inferredForPath = new Set<string>();\n\n private readonly data = inject<ListDataService<any>>(ListDataService as any);\n private readonly settings = inject(SettingsPanelService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n ngOnInit(): void {\n this.applyPersistence();\n // Try infer templating upfront when using remote resource\n this.tryInferTemplatingFromSchema(this.config);\n this.data.setConfig(this.config);\n this.items$ = this.data.stream();\n this.sections$ = this.data.groupedStream();\n this.loading$ = this.data.loading$;\n this.total$ = this.data.total$;\n this.setupSelectionBinding();\n this.applySkins();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config']) {\n // Avoid double initialization: the first change for @Input happens before ngOnInit.\n // We already perform the initial setup in ngOnInit, so skip the first change here.\n if (changes['config'].firstChange) return;\n this.applyPersistence();\n this.tryInferTemplatingFromSchema(this.config);\n this.data.setConfig(this.config);\n this.items$ = this.data.stream();\n this.sections$ = this.data.groupedStream();\n this.loading$ = this.data.loading$;\n this.total$ = this.data.total$;\n this.setupSelectionBinding();\n this.applySkins();\n }\n }\n\n private applyPersistence(): void {\n const id = this.config?.id;\n if (!id) return;\n const saved = this.storage.loadConfig<PraxisListConfig>(\n `praxis-list-config-${id}`,\n );\n if (saved) {\n this.config = { ...saved, id };\n }\n }\n\n private applySkins(): void {\n this.skinClasses = this.skin.toHostClasses(this.config).join(' ');\n this.inlineCss = this.skin.toInlineStyle(this.config);\n }\n\n isListVariant(): boolean {\n return (this.config?.layout?.variant || 'list') === 'list';\n }\n\n isSelectionEnabled(): boolean {\n return (this.config?.selection?.mode || 'none') !== 'none';\n }\n\n private setupSelectionBinding(): void {\n if (!this.isSelectionEnabled()) {\n // Keep a local control to satisfy template typing; it won't be used when selection is disabled\n this.boundControl.setValue(null);\n return;\n }\n const mode = this.config?.selection?.mode || 'none';\n const path = this.config?.selection?.formControlPath;\n const name = this.config?.selection?.formControlName;\n if (this.form && (name || path)) {\n const ctrl = name ? this.form.get(name) : path ? this.form.get(path!) : null;\n if (ctrl instanceof FormControl) {\n this.boundControl = ctrl as FormControl<any>;\n return;\n }\n }\n // Fallback to local control\n this.boundControl = new FormControl<unknown | unknown[] | null>(\n mode === 'multiple' ? ([] as unknown[]) : null,\n );\n }\n\n leading = (item: any) => this.evalSlot('leading', item);\n primary = (item: any) => this.evalSlot('primary', item);\n secondary = (item: any) => this.evalSlot('secondary', item);\n meta = (item: any) => this.evalSlot('meta', item);\n trailing = (item: any) => this.evalSlot('trailing', item);\n sectionHeader = (key: string) =>\n evaluateTemplate(this.config?.templating?.sectionHeader, { key })?.value || key;\n featureLabel(item: any, expr: string): string {\n return this.evalString(expr || '', { item });\n }\n featuresVisible(): boolean {\n const t = this.config?.templating;\n const has = (t?.features?.length || 0) > 0;\n const visible = t?.featuresVisible !== false;\n return has && visible;\n }\n featuresMode(): 'icons+labels'|'icons-only'|'labels-only' {\n return (this.config?.templating as any)?.featuresMode || 'icons+labels';\n }\n\n hasSkeleton(): boolean {\n return !!this.config?.templating?.skeleton && this.skeletonCount() > 0;\n }\n skeletonCount(): number {\n return this.config?.templating?.skeleton?.count ?? 3;\n }\n skeletonItems(): any[] {\n return Array.from({ length: this.skeletonCount() });\n }\n\n visibleActions(item: any) {\n const actions = this.config?.actions || [];\n return actions.filter((a) => {\n if (!a.showIf) return true;\n // Support simple equality checks like ${item.status} == 'done'\n const left = a.showIf.split('==')[0]?.trim();\n const right = a.showIf.split('==')[1]?.trim()?.replace(/^['\"]|['\"]$/g, '');\n if (left && right != null) {\n const val = left\n .replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n try {\n return String(\n path\n .split('.')\n .reduce((acc: any, k: string) => acc?.[k], { item }),\n );\n } catch {\n return '';\n }\n })\n .trim();\n return val === right;\n }\n return true;\n });\n }\n\n onItemClick(item: any, index: number, section?: string): void {\n this.itemClick.emit({ item, index, section });\n }\n\n onActionClick(ev: MouseEvent, actionId: string, item: any, index: number): void {\n ev.stopPropagation();\n this.actionClick.emit({ actionId, item, index });\n }\n\n onSelectionChange(_change: MatSelectionListChange): void {\n if (!this.boundControl) return;\n const val = this.boundControl.value;\n const arr = Array.isArray(val) ? val : val != null ? [val] : [];\n this.selectionChange.emit(adaptSelection(this.config, arr));\n }\n\n openConfigEditor(): void {\n const id = this.config?.id || 'default';\n const ref = this.settings.open({\n id: `praxis-list-editor:${id}`,\n title: 'Lista – Configurações',\n content: {\n component: PraxisListConfigEditor,\n inputs: { config: this.config, listId: id },\n },\n });\n\n ref.applied$.subscribe((applied) => {\n const newCfg: PraxisListConfig = applied?.config || applied;\n this.onEditorApplied(newCfg);\n });\n ref.saved$.subscribe((saved) => {\n const newCfg: PraxisListConfig = saved?.config || saved;\n this.storage.saveConfig(`praxis-list-config-${id}`, newCfg);\n this.onEditorApplied(newCfg);\n });\n }\n\n nextPage(): void {\n this.data.nextPage();\n }\n prevPage(): void {\n this.data.prevPage();\n }\n\n private onEditorApplied(newCfg: PraxisListConfig): void {\n this.config = newCfg;\n // Optionally infer templates from backend schema if not defined\n this.tryInferTemplatingFromSchema(newCfg);\n // Re-apply runtime wiring\n this.data.setConfig(this.config);\n this.setupSelectionBinding();\n this.applySkins();\n this.cdr.markForCheck();\n }\n\n private readonly crud = inject(GenericCrudService as any, { optional: true }) as GenericCrudService<any> | null;\n\n private tryInferTemplatingFromSchema(cfg: PraxisListConfig): void {\n const rp = cfg.dataSource?.resourcePath;\n if (!rp || !this.crud) return;\n const templ = cfg.templating || {};\n const needsPrimary = !templ.primary;\n if (!needsPrimary) return; // do not override when user already defined\n if (this.inferredForPath.has(rp)) return; // avoid repeated schema calls for the same path\n try {\n this.crud.configure(rp);\n this.crud\n .getSchema()\n .subscribe({\n next: (fields: any[]) => {\n this.inferredForPath.add(rp);\n const names = (fields || [])\n .map((f: any) => f.name || f.field || f.key)\n .filter(Boolean) as string[];\n if (!names.length) return;\n const updated = inferTemplatingFromSchema(cfg, names);\n // Assign back to current config reference\n // Only assign if primary is still not defined to avoid loops\n if (!this.config?.templating?.primary) {\n this.config = updated;\n }\n },\n error: () => {\n // ignore schema errors; keep config as-is\n this.inferredForPath.add(rp);\n },\n });\n } catch {\n // ignore\n }\n }\n\n private evalSlot(\n slot: 'leading' | 'primary' | 'secondary' | 'meta' | 'trailing',\n item: any,\n ) {\n const def = this.config?.templating?.[slot];\n if (!def) return null;\n if (def.type === 'currency') {\n const { baseExpr, param } = this.splitPipe(def.expr);\n const [codeFromExpr, localeFromExpr] = this.parseTwoParams(param);\n const currencyCode = codeFromExpr || (this.config?.i18n as any)?.currency || 'USD';\n const locale = localeFromExpr || (this.config?.i18n as any)?.locale || undefined;\n const rawStr = this.evalString(baseExpr, { item });\n const raw = Number(rawStr?.replace?.(/[^0-9.,-]/g, '').replace(',', '.') ?? rawStr);\n const fmt = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n }).format(raw ?? 0);\n return { type: def.type, value: fmt, class: def.class, style: def.style };\n }\n if (def.type === 'date') {\n const { baseExpr, param } = this.splitPipe(def.expr);\n const [localeFromExpr, styleFromExpr] = this.parseTwoParams(param);\n const locale = localeFromExpr || (this.config?.i18n as any)?.locale || undefined;\n const dateStyle = this.mapDateStyle(styleFromExpr);\n const raw = this.evalString(baseExpr, { item });\n const dt = raw ? new Date(raw) : null;\n const fmt = dt ? new Intl.DateTimeFormat(locale, dateStyle).format(dt) : '';\n return { type: def.type, value: fmt, class: def.class, style: def.style };\n }\n if (def.type === 'rating') {\n const { baseExpr } = this.splitPipe(def.expr);\n const raw = Number(this.evalString(baseExpr, { item }));\n return {\n type: def.type,\n value: isFinite(raw) ? String(raw) : '0',\n class: def.class,\n style: def.style,\n };\n }\n if (def.type === 'chip') {\n const { baseExpr, param } = this.splitPipe(def.expr);\n let value = this.evalString(baseExpr, { item });\n if (param) {\n const [pipeName, rest] = this.splitPipeName(param);\n if (pipeName === 'bool') {\n const [t, f] = this.parseTwoParams(rest);\n const truthy = this.toBoolean(value);\n value = truthy ? (t ?? 'Sim') : (f ?? 'Não');\n }\n }\n // Optional color mapping from config.templating.chipColorMap\n let color = (def as any).color as string | undefined;\n try {\n const map = (this.config?.templating as any)?.chipColorMap as Record<string, string> | undefined;\n if (map && typeof value === 'string') {\n const key = String(value).toLowerCase();\n const found = map[key] ?? map[value];\n if (found) color = found;\n }\n } catch {}\n // Optional label mapping\n try {\n const lmap = (this.config?.templating as any)?.chipLabelMap as Record<string, string> | undefined;\n if (lmap && typeof value === 'string') {\n const key = String(value).toLowerCase();\n const lbl = lmap[key] ?? lmap[value];\n if (lbl) value = lbl;\n } else if (typeof value === 'string') {\n value = this.prettyLabel(value);\n }\n } catch {}\n return { type: def.type, value, class: def.class, style: def.style, color, variant: (def as any).variant } as any;\n }\n return evaluateTemplate(def, item);\n }\n\n private splitPipe(expr: string): { baseExpr: string; param?: string } {\n const idx = expr.indexOf('|');\n if (idx === -1) return { baseExpr: expr.trim() };\n return { baseExpr: expr.slice(0, idx).trim(), param: expr.slice(idx + 1).trim() };\n }\n\n private splitPipeName(spec: string): [string, string | undefined] {\n const idx = spec.indexOf(':');\n if (idx === -1) return [spec.trim(), undefined];\n return [spec.slice(0, idx).trim(), spec.slice(idx + 1).trim()];\n }\n\n private evalString(expr: string, ctx: any): string {\n return expr.replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n try {\n const value = path\n .split('.')\n .reduce((acc: any, k: string) => (acc == null ? undefined : acc[k]), ctx);\n return value == null ? '' : String(value);\n } catch {\n return '';\n }\n });\n }\n\n private parseTwoParams(param?: string): [string | undefined, string | undefined] {\n if (!param) return [undefined, undefined];\n // Accept forms: \"A\", \"A:B\", \":B\" (only second)\n const parts = param.split(':');\n const first = parts[0]?.trim();\n const second = parts[1]?.trim();\n if (first === '') return [undefined, second || undefined];\n if (parts.length === 1) return [first || undefined, undefined];\n return [first || undefined, second || undefined];\n }\n\n private toBoolean(val: any): boolean {\n if (typeof val === 'boolean') return val;\n const s = String(val).trim().toLowerCase();\n return s === 'true' || s === '1' || s === 'yes' || s === 'sim' || s === 'on';\n }\n\n // Format labels like 'EM_ANDAMENTO' -> 'Em andamento'; 'PLANEJADA' -> 'Planejada'\n private prettyLabel(v: string): string {\n try {\n const t = String(v ?? '')\n .replace(/[\\s_\\-]+/g, ' ')\n .trim()\n .toLowerCase();\n if (!t) return '';\n return t.replace(/\\b\\w/g, (m) => m.toUpperCase());\n } catch { return String(v ?? ''); }\n }\n\n private mapDateStyle(style?: string): Intl.DateTimeFormatOptions {\n switch ((style || '').toLowerCase()) {\n case 'short':\n return { dateStyle: 'short' };\n case 'long':\n return { dateStyle: 'long' };\n case 'full':\n return { dateStyle: 'full' };\n case 'medium':\n default:\n return { dateStyle: 'medium' };\n }\n }\n\n starIcon(index: number, ratingValue: string | number): string {\n const r = typeof ratingValue === 'number' ? ratingValue : parseFloat(ratingValue || '0');\n const pos = index + 1; // 1..5\n if (r >= pos) return 'star';\n if (r >= pos - 0.5) return 'star_half';\n return 'star_border';\n }\n\n // trackBy helpers for ngFor\n trackBySection = (_: number, s: ListSection<any>) => s?.key ?? _;\n trackByItem = (i: number, it: any) =>\n this.config?.selection?.compareBy ? (it?.[this.config.selection.compareBy] ?? i) : (it?.id ?? i);\n}\n","<div\n class=\"praxis-list-root\"\n [ngClass]=\"skinClasses\"\n [attr.aria-label]=\"config.a11y?.ariaLabel || null\"\n [attr.aria-labelledby]=\"config.a11y?.ariaLabelledBy || null\"\n>\n @if (inlineCss) {\n <style [innerHTML]=\"inlineCss\"></style>\n }\n\n <!-- Skeleton while loading -->\n @if ((loading$ | async) && hasSkeleton()) {\n @if (isListVariant()) {\n <mat-list>\n @for (_ of skeletonItems(); track $index; let i = $index) {\n <mat-list-item>\n <div class=\"list-item-content\">\n <div class=\"skeleton skeleton-avatar\"></div>\n <div style=\"width:100%\">\n <div class=\"skeleton skeleton-line w-60\"></div>\n @if (layoutLines > 1) { <div class=\"skeleton skeleton-line w-40\"></div> }\n </div>\n <div class=\"skeleton skeleton-chip\"></div>\n </div>\n </mat-list-item>\n }\n </mat-list>\n } @else {\n <div class=\"cards-grid\">\n @for (_ of skeletonItems(); track $index; let i = $index) {\n <div class=\"item-card\">\n <div class=\"list-item-content\">\n <div class=\"skeleton skeleton-avatar\"></div>\n <div style=\"width:100%\">\n <div class=\"skeleton skeleton-line w-60\"></div>\n @if (layoutLines > 1) { <div class=\"skeleton skeleton-line w-40\"></div> }\n </div>\n <div class=\"skeleton skeleton-chip\"></div>\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"notLoading\"></ng-container>\n }\n\n <ng-template #notLoading>\n <!-- Empty state -->\n @if (items$ | async; as all) {\n @if (all.length === 0) {\n <div class=\"section-header\">\n {{ (config.templating?.emptyState?.expr || 'Nenhum item disponível') }}\n </div>\n }\n }\n\n <!-- List variant -->\n @if (isListVariant()) {\n <!-- Selection list -->\n @if (isSelectionEnabled()) {\n <mat-selection-list\n [multiple]=\"config.selection?.mode === 'multiple'\"\n [formControl]=\"boundControl\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n @for (section of sections$ | async; track trackBySection($index, section)) {\n @if (section.key) {\n <div class=\"section-header mat-subheader\">\n {{ sectionHeader(section.key) }}\n </div>\n }\n @for (item of section.items; track trackByItem($index, item); let i = $index) {\n <mat-list-option\n [value]=\"item\"\n (click)=\"onItemClick(item, i, section.key || undefined)\"\n >\n <div class=\"list-item-content\">\n @if (leading(item); as lead) {\n @switch (lead.type) {\n @case ('icon') {\n <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon>\n }\n @case ('image') {\n <div class=\"lead-image\" [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">\n <img [src]=\"lead.value\" [alt]=\"config.templating?.leading?.imageAlt || ''\" />\n @if (lead.badge?.value) {\n <mat-chip class=\"lead-badge\" [color]=\"lead.badge?.color || undefined\" [ngClass]=\"(((lead.badge?.variant || 'filled') === 'outlined') ? 'chip-outlined' : '')\">{{ lead.badge?.value }}</mat-chip>\n }\n </div>\n }\n }\n }\n @if (meta(item); as m) {\n <div>\n <div class=\"primary\" [ngClass]=\"primary(item)?.class\" [style.cssText]=\"primary(item)?.style\">{{ primary(item)?.value }}</div>\n @if (layoutLines > 1) { <div class=\"secondary\" [ngClass]=\"secondary(item)?.class\" [style.cssText]=\"secondary(item)?.style\">{{ secondary(item)?.value }}</div> }\n @if ((config.templating?.metaPlacement === 'line' && m?.type === 'text') || (layoutLines > 2 && m?.type === 'text')) {\n <div class=\"tertiary\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @if (config.templating?.metaPrefixIcon; as mpi) { <mat-icon [praxisIcon]=\"mpi\"></mat-icon> }\n {{ m.value }}\n </div>\n }\n @if (featuresVisible()) {\n @for (f of (config.templating?.features || []); track $index; let fi = $index) {\n <span class=\"feature\">\n @if (f.icon && featuresMode() !== 'labels-only') { <mat-icon [praxisIcon]=\"f.icon\"></mat-icon> }\n @if (featuresMode() !== 'icons-only') { <span [ngClass]=\"f.class\" [style.cssText]=\"f.style\">{{ featureLabel(item, f.expr) }}</span> }\n </span>\n }\n }\n </div>\n @if (!(((config.templating?.metaPlacement === 'line') || (layoutLines > 2)) && m?.type === 'text')) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip [color]=\"m.color || undefined\" [ngClass]=\"((m.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon [praxisIcon]=\"starIcon(idx, m.value)\"></mat-icon> } }\n @default { <span>@if (config.templating?.metaPrefixIcon; as mpi2) { <mat-icon>{{ mpi2 }}</mat-icon> }{{ m.value }}</span> }\n }\n </div>\n }\n @if (trailing(item); as tr) {\n <div class=\"trailing\" [ngClass]=\"tr.class\" [style.cssText]=\"tr.style\">\n @switch (tr.type) {\n @case ('chip') { <mat-chip [color]=\"tr.color || undefined\" [ngClass]=\"((tr.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ tr.value }}</mat-chip> }\n @default { <span>{{ tr.value }}</span> }\n }\n </div>\n }\n }\n @for (action of visibleActions(item); let aidx = $index; track action?.id ?? $index) {\n @if ((action.kind || 'icon') === 'icon') {\n <button mat-icon-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">\n <mat-icon [praxisIcon]=\"action.icon\"></mat-icon>\n </button>\n } @else {\n @if (action.buttonVariant === 'stroked') { <button mat-stroked-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n @if (action.buttonVariant === 'raised') { <button mat-raised-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n @if (!action.buttonVariant || action.buttonVariant === 'flat') { <button mat-flat-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n }\n }\n </div>\n </mat-list-option>\n }\n }\n </mat-selection-list>\n } @else {\n <ng-container *ngTemplateOutlet=\"readList\"></ng-container>\n }\n\n <!-- Read-only list -->\n <ng-template #readList>\n <mat-list>\n @for (section of sections$ | async; track trackBySection($index, section); let sidx = $index) {\n @if (section.key) {\n <div class=\"section-header mat-subheader\">\n {{ sectionHeader(section.key) }}\n </div>\n }\n @for (item of section.items; track trackByItem($index, item); let i = $index) {\n <mat-list-item (click)=\"onItemClick(item, i, section.key || undefined)\">\n <div class=\"list-item-content\">\n @if (leading(item); as lead) { <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon> }\n @if (meta(item); as m) {\n <div>\n <div class=\"primary\" [ngClass]=\"primary(item)?.class\" [style.cssText]=\"primary(item)?.style\">{{ primary(item)?.value }}</div>\n @if (layoutLines > 1) { <div class=\"secondary\" [ngClass]=\"secondary(item)?.class\" [style.cssText]=\"secondary(item)?.style\">{{ secondary(item)?.value }}</div> }\n @if ((config.templating?.metaPlacement === 'line' && m?.type === 'text') || (layoutLines > 2 && m?.type === 'text')) { <div class=\"tertiary\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">{{ m.value }}</div> }\n </div>\n @if (!(((config.templating?.metaPlacement === 'line') || (layoutLines > 2)) && m?.type === 'text')) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip>{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon>{{ starIcon(idx, m.value) }}</mat-icon> } }\n @default { <span>{{ m.value }}</span> }\n }\n </div>\n }\n @if (trailing(item); as tr) {\n <div class=\"trailing\" [ngClass]=\"tr.class\" [style.cssText]=\"tr.style\">\n @switch (tr.type) {\n @case ('chip') { <mat-chip>{{ tr.value }}</mat-chip> }\n @default { <span>{{ tr.value }}</span> }\n }\n </div>\n }\n }\n @for (action of visibleActions(item); let aidx = $index; track action?.id ?? $index) {\n <button mat-icon-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">\n <mat-icon>{{ action.icon }}</mat-icon>\n </button>\n }\n </div>\n </mat-list-item>\n }\n @if (config.layout?.dividers === 'between') { <mat-divider></mat-divider> }\n }\n </mat-list>\n </ng-template>\n } @else {\n <ng-container *ngTemplateOutlet=\"cardsVariant\"></ng-container>\n }\n\n <!-- Cards variant -->\n <ng-template #cardsVariant>\n <div class=\"cards-grid\">\n @for (it of (items$ | async) ?? []; track $index; let i = $index) {\n <div class=\"item-card\" (click)=\"onItemClick(it, i)\">\n <div class=\"list-item-content\">\n @if (leading(it); as lead) {\n @switch (lead.type) {\n @case ('icon') { <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon> }\n @case ('image') {\n <div class=\"lead-image\" [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">\n <img [src]=\"lead.value\" [alt]=\"config.templating?.leading?.imageAlt || ''\" />\n @if (lead.badge?.value) { <mat-chip class=\"lead-badge\" [color]=\"lead.badge?.color || undefined\" [ngClass]=\"(((lead.badge?.variant || 'filled') === 'outlined') ? 'chip-outlined' : '')\">{{ lead.badge?.value }}</mat-chip> }\n </div>\n }\n }\n }\n @if (meta(it); as m) {\n <div>\n <div class=\"primary\" [ngClass]=\"primary(it)?.class\" [style.cssText]=\"primary(it)?.style\">{{ primary(it)?.value }}</div>\n @if (layoutLines > 1) { <div class=\"secondary\" [ngClass]=\"secondary(it)?.class\" [style.cssText]=\"secondary(it)?.style\">{{ secondary(it)?.value }}</div> }\n @if ((config.templating?.metaPlacement === 'line' && m?.type === 'text') || (layoutLines > 2 && m?.type === 'text')) { <div class=\"tertiary\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">{{ m.value }}</div> }\n @if (featuresVisible()) {\n @for (f of (config.templating?.features || []); track $index; let fi = $index) {\n <span class=\"feature\">\n @if (f.icon && featuresMode() !== 'labels-only') { <mat-icon>{{ f.icon }}</mat-icon> }\n @if (featuresMode() !== 'icons-only') { <span [ngClass]=\"f.class\" [style.cssText]=\"f.style\">{{ featureLabel(it, f.expr) }}</span> }\n </span>\n }\n }\n </div>\n @if (!(((config.templating?.metaPlacement === 'line') || (layoutLines > 2)) && m?.type === 'text')) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip [color]=\"m.color || undefined\" [ngClass]=\"((m.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon>{{ starIcon(idx, m.value) }}</mat-icon> } }\n @default { <span>{{ m.value }}</span> }\n }\n </div>\n }\n @if (trailing(it); as tr) {\n @if ((config.templating?.statusPosition || 'inline') === 'top-right' && tr?.type === 'chip') {\n <div class=\"status-overlay\">\n <mat-chip [color]=\"tr.color || undefined\" [ngClass]=\"((tr.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ tr.value }}</mat-chip>\n </div>\n } @else {\n <div class=\"trailing\" [ngClass]=\"tr.class\" [style.cssText]=\"tr.style\">\n @switch (tr.type) {\n @case ('chip') { <mat-chip [color]=\"tr.color || undefined\" [ngClass]=\"((tr.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ tr.value }}</mat-chip> }\n @default { <span>{{ tr.value }}</span> }\n }\n </div>\n }\n }\n }\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n @for (action of visibleActions(it); let aidx = $index; track action?.id ?? $index) {\n @if ((action.kind || 'icon') === 'icon') {\n <button mat-icon-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, it, i)\" [attr.aria-label]=\"action.label || action.id\">\n <mat-icon>{{ action.icon }}</mat-icon>\n </button>\n } @else {\n @if (action.buttonVariant === 'stroked') { <button mat-stroked-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, it, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n @if (action.buttonVariant === 'raised') { <button mat-raised-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, it, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n @if (!action.buttonVariant || action.buttonVariant === 'flat') { <button mat-flat-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, it, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n }\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n \n <!-- Simple pagination controls for remote data -->\n @if (config.dataSource?.resourcePath) {\n <div class=\"paginator\">\n <button mat-stroked-button color=\"primary\" (click)=\"prevPage()\">Anterior</button>\n <button mat-stroked-button color=\"primary\" (click)=\"nextPage()\">Próximo</button>\n @if (total$ | async; as total) { <span class=\"muted\">Total: {{ total }}</span> }\n </div>\n }\n </ng-template>\n</div>\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\nimport { PraxisList } from './components/praxis-list.component';\n\nexport const PRAXIS_LIST_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-list',\n selector: 'praxis-list',\n component: PraxisList,\n friendlyName: 'Praxis List',\n description: 'Lista com suporte a seleção (single/multiple), agrupamento e templates.',\n icon: 'checklist',\n inputs: [\n { name: 'config', type: 'PraxisListConfig', description: 'Configuração da lista (fonte de dados, layout, seleção, templates, ações)' },\n { name: 'form', type: 'FormGroup', description: 'FormGroup opcional quando integrado a formulários' },\n ],\n outputs: [\n { name: 'itemClick', type: 'ListItemEvent', description: 'Clique em item' },\n { name: 'actionClick', type: 'ListActionEvent', description: 'Clique em ação de item' },\n { name: 'selectionChange', type: 'ListSelectionEvent', description: 'Mudança de seleção' },\n ],\n tags: ['widget', 'list', 'selection', 'configurable'],\n lib: '@praxisui/list',\n};\n\nexport function providePraxisListMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_LIST_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","/*\n * Public API Surface of praxis-list\n */\n\nexport * from './lib/components/praxis-list.component';\nexport * from './lib/editors/list-config-editor.component';\nexport * from './lib/models/list-config.model';\nexport * from './lib/services/list-data.service';\nexport * from './lib/utils/templating-inference';\nexport * from './lib/services/list-skin.service';\nexport * from './lib/utils/template-evaluator';\nexport * from './lib/utils/selection-adapter';\nexport * from './lib/praxis-list.metadata';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ListSkinService","i5","i3","i4","i9","i13","i6"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"praxisui-list.mjs","sources":["../../../projects/praxis-list/src/lib/utils/template-evaluator.ts","../../../projects/praxis-list/src/lib/utils/selection-adapter.ts","../../../projects/praxis-list/src/lib/services/list-data.service.ts","../../../projects/praxis-list/src/lib/services/list-skin.service.ts","../../../projects/praxis-list/src/lib/components/list-skin-preview.component.ts","../../../projects/praxis-list/src/lib/components/list-skin-preview.component.html","../../../projects/praxis-list/src/lib/utils/templating-inference.ts","../../../projects/praxis-list/src/lib/editors/list-config-editor.component.ts","../../../projects/praxis-list/src/lib/components/praxis-list.component.ts","../../../projects/praxis-list/src/lib/components/praxis-list.component.html","../../../projects/praxis-list/src/lib/praxis-list.metadata.ts","../../../projects/praxis-list/src/public-api.ts","../../../projects/praxis-list/src/praxisui-list.ts"],"sourcesContent":["import { TemplateDef } from '../models/list-config.model';\n\n/**\n * Very small template evaluator that supports `${item.foo}` expressions.\n * For security, only string concatenation is supported; no arbitrary code.\n */\nexport function evalExpr(expr: string, ctx: any): string {\n if (!expr) return '';\n // Replace ${...} with values from context (item), supporting simple pipes inside placeholders\n return expr.replace(/\\$\\{([^}]+)\\}/g, (_, raw: string) => {\n try {\n const { baseExpr, pipe } = splitFirstPipe(raw);\n const value = baseExpr\n .split('.')\n .reduce((acc: any, k: string) => (acc == null ? undefined : acc[k]), ctx);\n let out = value == null ? '' : String(value);\n if (pipe) {\n const { name, args } = parsePipe(pipe);\n if (name === 'bool') {\n const [trueLabel, falseLabel] = parseTwoArgs(args);\n const truthy = toBoolean(value);\n out = truthy ? (trueLabel ?? 'Sim') : (falseLabel ?? 'Não');\n }\n if (name === 'date') {\n const [localeArg, styleArg] = parseTwoArgs(args);\n const dt = value ? new Date(value) : null;\n if (dt && !isNaN(dt.getTime())) {\n const fmt = new Intl.DateTimeFormat(localeArg || undefined, mapDateStyle(styleArg)).format(dt);\n out = fmt;\n } else {\n out = '';\n }\n }\n if (name === 'map') {\n const map = parseMap(args);\n const key = String(value ?? '').trim();\n out = map[key] ?? map[key.toLowerCase?.()] ?? map[key.toUpperCase?.()] ?? out;\n }\n if (name === 'number') {\n const [localeArg, styleArg] = parseTwoArgs(args);\n const num = Number(value);\n if (isFinite(num)) {\n const opt: Intl.NumberFormatOptions = {};\n if ((styleArg || '').toLowerCase() === 'compact') opt.notation = 'compact';\n out = new Intl.NumberFormat(localeArg || undefined, opt).format(num);\n }\n }\n }\n return out;\n } catch {\n return '';\n }\n });\n}\n\n/**\n * Evaluate a template definition with basic pipe support.\n * Supported pipes:\n * - bool:TrueLabel:FalseLabel (maps truthy/falsey values to provided labels)\n */\nexport function evaluateTemplate(\n def: TemplateDef | undefined,\n item: any,\n): { type: string; value: string; class?: string; style?: string; color?: string; variant?: 'filled'|'outlined'; badge?: { value: string; color?: string; variant?: 'filled'|'outlined' } } | null {\n if (!def) return null;\n const { baseExpr, pipe } = splitFirstPipe(def.expr);\n let value = evalExpr(baseExpr, { item });\n\n if (pipe) {\n const { name, args } = parsePipe(pipe);\n if (name === 'bool') {\n const [trueLabel, falseLabel] = parseTwoArgs(args);\n const truthy = toBoolean(value);\n value = truthy ? (trueLabel ?? 'Sim') : (falseLabel ?? 'Não');\n }\n }\n\n const out: any = { type: def.type, value, class: def.class, style: def.style, color: (def as any).color, variant: (def as any).variant };\n if (def.badge?.expr) {\n const { baseExpr: b2, pipe: p2 } = splitFirstPipe(def.badge.expr);\n let badgeVal = evalExpr(b2, { item });\n if (p2) {\n const { name, args } = parsePipe(p2);\n if (name === 'bool') {\n const [trueLabel, falseLabel] = parseTwoArgs(args);\n const truthy = toBoolean(badgeVal);\n badgeVal = truthy ? (trueLabel ?? 'Sim') : (falseLabel ?? 'Não');\n }\n }\n out.badge = {\n value: badgeVal,\n color: def.badge.color,\n variant: def.badge.variant,\n };\n }\n return out;\n}\n\nfunction splitFirstPipe(expr: string): { baseExpr: string; pipe?: string } {\n const idx = expr.indexOf('|');\n if (idx === -1) return { baseExpr: expr.trim() };\n return { baseExpr: expr.slice(0, idx).trim(), pipe: expr.slice(idx + 1).trim() };\n}\n\nfunction parsePipe(pipeSpec: string): { name: string; args?: string } {\n const idx = pipeSpec.indexOf(':');\n if (idx === -1) return { name: pipeSpec.trim() };\n return { name: pipeSpec.slice(0, idx).trim(), args: pipeSpec.slice(idx + 1).trim() };\n}\n\nfunction parseTwoArgs(argSpec?: string): [string | undefined, string | undefined] {\n if (!argSpec) return [undefined, undefined];\n const parts = argSpec.split(':');\n const first = parts[0]?.trim();\n const second = parts[1]?.trim();\n return [first || undefined, second || undefined];\n}\n\nfunction toBoolean(val: any): boolean {\n if (typeof val === 'boolean') return val;\n const s = String(val).trim().toLowerCase();\n return s === 'true' || s === '1' || s === 'yes' || s === 'sim' || s === 'on';\n}\n\nfunction mapDateStyle(style?: string): Intl.DateTimeFormatOptions {\n switch ((style || '').toLowerCase()) {\n case 'short':\n return { dateStyle: 'short' } as Intl.DateTimeFormatOptions;\n case 'long':\n return { dateStyle: 'long' } as Intl.DateTimeFormatOptions;\n case 'full':\n return { dateStyle: 'full' } as Intl.DateTimeFormatOptions;\n case 'medium':\n default:\n return { dateStyle: 'medium' } as Intl.DateTimeFormatOptions;\n }\n}\n\nfunction parseMap(spec?: string): Record<string, string> {\n const out: Record<string, string> = {};\n if (!spec) return out;\n const entries = spec.split(/[,;|]/g).map(s => s.trim()).filter(Boolean);\n for (const e of entries) {\n const idx = e.indexOf('=');\n if (idx === -1) continue;\n const k = e.slice(0, idx).trim();\n const v = e.slice(idx + 1).trim();\n if (k) out[k] = v;\n }\n return out;\n}\n","import { ListSelectionEvent, PraxisListConfig } from '../models/list-config.model';\n\nexport function adaptSelection(\n config: PraxisListConfig | undefined,\n items: any[],\n): ListSelectionEvent {\n const mode = (config?.selection?.mode ?? 'none') as 'single' | 'multiple';\n const compareBy = config?.selection?.compareBy;\n const ret = config?.selection?.return ?? 'value';\n const value = mode === 'single' ? items[0] ?? null : items;\n const ids = compareBy ? items.map((it) => it?.[compareBy]) : undefined;\n let out: any = value;\n if (ret === 'id') out = mode === 'single' ? ids?.[0] ?? null : ids;\n else if (ret === 'item') out = value;\n else if (ret === 'value') out = mode === 'single' ? value : items;\n\n return {\n mode,\n value: out,\n items,\n ids,\n };\n}\n\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject, Observable, combineLatest, of } from 'rxjs';\nimport { auditTime, catchError, finalize, map, shareReplay, switchMap } from 'rxjs/operators';\nimport { PraxisListConfig } from '../models/list-config.model';\nimport { GenericCrudService } from '@praxisui/core';\n\nexport interface ListSection<T = any> {\n key: string | undefined;\n items: T[];\n}\n\n@Injectable()\nexport class ListDataService<T = any> {\n private config$ = new BehaviorSubject<PraxisListConfig | null>(null);\n private refresh$ = new BehaviorSubject<void>(undefined);\n private pageable$ = new BehaviorSubject<{ pageNumber: number; pageSize: number; sort?: string[] }>({ pageNumber: 0, pageSize: 10 });\n private query$ = new BehaviorSubject<Record<string, any>>({});\n readonly loading$ = new BehaviorSubject<boolean>(false);\n readonly total$ = new BehaviorSubject<number>(0);\n private lastSig = '';\n\n private readonly crud = inject(GenericCrudService as any, {\n optional: true,\n }) as GenericCrudService<T> | null;\n\n setConfig(config: PraxisListConfig): void {\n const sig = JSON.stringify({\n rp: config?.dataSource?.resourcePath || '',\n sort: (config?.dataSource?.sort || []).join(','),\n ps: config?.layout?.pageSize ?? 10,\n q: config?.dataSource?.query ? Object.keys(config.dataSource.query).length : 0,\n });\n const changed = sig !== this.lastSig;\n this.lastSig = sig;\n if (changed) {\n this.config$.next(config);\n const ps = config.layout?.pageSize ?? 10;\n this.pageable$.next({ ...this.pageable$.value, pageNumber: 0, pageSize: ps, sort: config.dataSource?.sort });\n this.query$.next(config.dataSource?.query || {});\n }\n }\n\n refresh(): void {\n this.refresh$.next();\n }\n\n private _stream$?: Observable<T[]>;\n\n stream(): Observable<T[]> {\n if (!this._stream$) {\n this._stream$ = combineLatest([\n this.config$,\n this.pageable$,\n this.query$,\n this.refresh$,\n ]).pipe(\n auditTime(0),\n switchMap(([cfg, pageable, query]) => {\n if (!cfg) return of([]);\n const ds = cfg.dataSource;\n if (ds?.data) {\n this.loading$.next(false);\n this.total$.next((ds.data as T[]).length);\n return of(ds.data as T[]);\n }\n if (ds?.resourcePath && this.crud) {\n try {\n const req: any = { pageNumber: pageable.pageNumber, pageSize: pageable.pageSize };\n if (pageable.sort && pageable.sort.length) req.sort = pageable.sort;\n this.crud.configure(ds.resourcePath);\n console.debug('[PraxisList] fetching via /filter', {\n resourcePath: ds.resourcePath,\n query,\n pageable: req,\n });\n this.loading$.next(true);\n const obs = (this.crud as any)\n .filter(query || {}, req)\n .pipe(\n map((page: any) => {\n const content = (page?.content ?? page ?? []) as T[];\n const total = typeof page?.totalElements === 'number' ? page.totalElements : content.length;\n this.total$.next(total);\n return content;\n }),\n // Fallback: if backend doesn't support /filter for this resource, try GET all\n catchError((err) => {\n console.warn('[PraxisList] /filter failed, falling back to GET all', err);\n return (this.crud as any).getAll().pipe(\n map((arr: T[]) => {\n const content = arr || [];\n this.total$.next(content.length);\n return content;\n }),\n );\n }),\n finalize(() => this.loading$.next(false)),\n );\n return obs as unknown as Observable<T[]>;\n } catch {\n this.loading$.next(false);\n return of([]);\n }\n }\n this.loading$.next(false);\n return of([]);\n }),\n shareReplay(1),\n );\n }\n return this._stream$;\n }\n\n nextPage(): void {\n const p = this.pageable$.value;\n this.pageable$.next({ ...p, pageNumber: p.pageNumber + 1 });\n }\n prevPage(): void {\n const p = this.pageable$.value;\n this.pageable$.next({ ...p, pageNumber: Math.max(0, p.pageNumber - 1) });\n }\n setPageSize(size: number): void {\n const p = this.pageable$.value;\n this.pageable$.next({ ...p, pageSize: Math.max(1, size), pageNumber: 0 });\n }\n setSort(sort: string[]): void {\n const p = this.pageable$.value;\n this.pageable$.next({ ...p, sort, pageNumber: 0 });\n }\n setQuery(q: Record<string, any>): void {\n this.query$.next(q || {});\n }\n\n groupedStream(): Observable<ListSection<T>[]> {\n return this.stream().pipe(\n switchMap((items) =>\n this.config$.pipe(\n map((cfg) => cfg?.layout?.groupBy),\n map((groupBy) => {\n if (!groupBy) return [{ key: undefined, items }];\n const groups = new Map<string, T[]>();\n for (const it of items) {\n const key = (it as any)?.[groupBy];\n const skey = key == null ? '' : String(key);\n if (!groups.has(skey)) groups.set(skey, []);\n groups.get(skey)!.push(it);\n }\n return Array.from(groups.entries()).map(([key, arr]) => ({\n key,\n items: arr,\n }));\n }),\n ),\n ),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { PraxisListConfig } from '../models/list-config.model';\n\n@Injectable({ providedIn: 'root' })\nexport class ListSkinService {\n toHostClasses(config?: PraxisListConfig): string[] {\n const skin = config?.skin?.type || 'elevated';\n const density = config?.layout?.density || 'default';\n const model = config?.layout?.model || 'standard';\n const classes = [\n `skin-${skin}`,\n `density-${density}`,\n `model-${model}`,\n config?.skin?.class || '',\n ].filter(Boolean);\n return classes;\n }\n\n toInlineStyle(config?: PraxisListConfig): string {\n const s = config?.skin;\n if (!s) return '';\n const vars: string[] = [];\n if (s.radius) vars.push(`--p-list-radius: ${s.radius}`);\n if (s.shadow) vars.push(`--p-list-shadow: ${s.shadow}`);\n if (s.border) vars.push(`--p-list-border: ${s.border}`);\n if (s.backdropBlur) vars.push(`--p-list-blur: ${s.backdropBlur}`);\n if (s.gradient?.from) vars.push(`--p-list-grad-from: ${s.gradient.from}`);\n if (s.gradient?.to) vars.push(`--p-list-grad-to: ${s.gradient.to}`);\n if (s.gradient?.angle != null)\n vars.push(`--p-list-grad-angle: ${s.gradient.angle}deg`);\n const base = `:host{${vars.join(';')}}`;\n const extra = sanitizeCss((s.inlineStyle || '').trim());\n return extra ? base + extra : base;\n }\n}\n\nfunction sanitizeCss(css: string): string {\n // Remove padrões e funções de alto risco\n const banned = /(url\\s*\\(|@import|expression\\s*\\(|behavior\\s*\\:)/gi;\n return css.replace(banned, '');\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatListModule } from '@angular/material/list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { PraxisListConfig, TemplateDef } from '../models/list-config.model';\nimport { ListSkinService } from '../services/list-skin.service';\nimport { evaluateTemplate } from '../utils/template-evaluator';\n\n@Component({\n selector: 'praxis-list-skin-preview',\n standalone: true,\n imports: [CommonModule, MatListModule, MatIconModule, MatChipsModule],\n templateUrl: './list-skin-preview.component.html',\n styleUrls: ['./list-skin-preview.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PraxisListSkinPreviewComponent {\n @Input() config!: PraxisListConfig;\n @Input() items: any[] = [];\n @Input() theme: 'light'|'dark'|'grid' = 'light';\n\n constructor(private skin: ListSkinService) {}\n\n get skinClasses(): string {\n const base = this.skin.toHostClasses(this.config);\n return [this.themeClass(), ...base].join(' ');\n }\n get inlineCss(): string {\n return this.skin.toInlineStyle(this.config);\n }\n\n themeClass(): string {\n switch (this.theme) {\n case 'dark': return 'preview-dark';\n case 'grid': return 'preview-grid';\n default: return 'preview-light';\n }\n }\n\n isList(): boolean {\n return (this.config?.layout?.variant || 'list') === 'list';\n }\n\n leading = (item: any) => evaluateTemplate(this.config?.templating?.leading, item);\n primary = (item: any) => evaluateTemplate(this.config?.templating?.primary, item);\n secondary = (item: any) => evaluateTemplate(this.config?.templating?.secondary, item);\n meta = (item: any) => evaluateTemplate(this.config?.templating?.meta, item);\n featureLabel(item: any, expr: string): string {\n // simple replacement using the same evaluator used internally\n return String(expr || '').replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n try {\n const value = path.split('.').reduce((acc: any, k: string) => (acc == null ? undefined : acc[k]), { item });\n return value == null ? '' : String(value);\n } catch {\n return '';\n }\n });\n }\n featuresVisible(): boolean {\n const t = this.config?.templating as any;\n const has = (t?.features?.length || 0) > 0;\n const visible = t?.featuresVisible !== false;\n return has && visible;\n }\n featuresMode(): 'icons+labels'|'icons-only'|'labels-only' {\n return ((this.config?.templating as any)?.featuresMode as any) || 'icons+labels';\n }\n\n starIcon(index: number, ratingValue: string | number): string {\n const r = typeof ratingValue === 'number' ? ratingValue : parseFloat(ratingValue || '0');\n const pos = index + 1; // 1..5\n if (r >= pos) return 'star';\n if (r >= pos - 0.5) return 'star_half';\n return 'star_border';\n }\n\n // trackBy for preview lists\n trackByIndex = (i: number) => i;\n}\n","<div class=\"preview-root\" [ngClass]=\"skinClasses\">\n @if (inlineCss) { <style [innerHTML]=\"inlineCss\"></style> }\n\n @if (isList()) {\n <mat-list>\n @for (item of items; track trackByIndex($index)) {\n <mat-list-item>\n <div class=\"list-item-content\">\n @if (leading(item); as lead) {\n @switch (lead.type) {\n @case ('icon') { <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon> }\n @case ('image') {\n <div class=\"lead-image\" [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">\n <img [src]=\"lead.value\" [alt]=\"config.templating?.leading?.imageAlt || ''\" />\n @if (lead.badge?.value) { <mat-chip class=\"lead-badge\" [color]=\"lead.badge?.color || undefined\" [ngClass]=\"(((lead.badge?.variant || 'filled') === 'outlined') ? 'chip-outlined' : '')\">{{ lead.badge?.value }}</mat-chip> }\n </div>\n }\n }\n }\n <div>\n <div class=\"primary\" [ngClass]=\"primary(item)?.class\" [style.cssText]=\"primary(item)?.style\">{{ primary(item)?.value }}</div>\n @if ((config.layout?.lines || 1) > 1) { <div class=\"secondary\" [ngClass]=\"secondary(item)?.class\" [style.cssText]=\"secondary(item)?.style\">{{ secondary(item)?.value }}</div> }\n @if (featuresVisible()) {\n @for (f of (config.templating?.features || []); track $index; let fi = $index) {\n <span class=\"feature\">\n @if (f.icon && featuresMode() !== 'labels-only') { <mat-icon>{{ f.icon }}</mat-icon> }\n @if (featuresMode() !== 'icons-only') { <span [ngClass]=\"f.class\" [style.cssText]=\"f.style\">{{ featureLabel(item, f.expr) }}</span> }\n </span>\n }\n }\n </div>\n @if (meta(item); as m) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip [color]=\"m.color || undefined\" [ngClass]=\"((m.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon>{{ starIcon(idx, m.value) }}</mat-icon> } }\n @default { <span>{{ m.value }}</span> }\n }\n </div>\n }\n </div>\n </mat-list-item>\n }\n </mat-list>\n } @else {\n <div class=\"cards-grid\">\n @for (it of items; track trackByIndex($index)) {\n <div class=\"item-card\">\n <div class=\"list-item-content\">\n @if (leading(it); as lead) {\n @switch (lead.type) {\n @case ('icon') { <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon> }\n @case ('image') {\n <div class=\"lead-image\" [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">\n <img [src]=\"lead.value\" [alt]=\"config.templating?.leading?.imageAlt || ''\" />\n @if (lead.badge?.value) { <mat-chip class=\"lead-badge\" [color]=\"lead.badge?.color || undefined\" [ngClass]=\"(((lead.badge?.variant || 'filled') === 'outlined') ? 'chip-outlined' : '')\">{{ lead.badge?.value }}</mat-chip> }\n </div>\n }\n }\n }\n <div>\n <div class=\"primary\" [ngClass]=\"primary(it)?.class\" [style.cssText]=\"primary(it)?.style\">{{ primary(it)?.value }}</div>\n @if ((config.layout?.lines || 1) > 1) { <div class=\"secondary\" [ngClass]=\"secondary(it)?.class\" [style.cssText]=\"secondary(it)?.style\">{{ secondary(it)?.value }}</div> }\n @if (featuresVisible()) {\n @for (f of (config.templating?.features || []); track $index; let fi = $index) {\n <span class=\"feature\">\n @if (f.icon && featuresMode() !== 'labels-only') { <mat-icon>{{ f.icon }}</mat-icon> }\n @if (featuresMode() !== 'icons-only') { <span [ngClass]=\"f.class\" [style.cssText]=\"f.style\">{{ featureLabel(it, f.expr) }}</span> }\n </span>\n }\n }\n </div>\n @if (meta(it); as m) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip [color]=\"m.color || undefined\" [ngClass]=\"((m.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon>{{ starIcon(idx, m.value) }}</mat-icon> } }\n @default { <span>{{ m.value }}</span> }\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n }\n</div>\n","import { produce } from 'immer';\nimport type { PraxisListConfig, TemplateDef } from '../models/list-config.model';\n\n/**\n * Infer templating slots (primary/secondary/trailing) from field names.\n * - Does not override existing primary if already defined.\n * - Heuristics prioritize Portuguese labels, then common English names.\n */\nexport function inferTemplatingFromSchema(cfg: PraxisListConfig, fieldNames: string[]): PraxisListConfig {\n const names = (fieldNames || []).filter(Boolean);\n if (!names.length) return cfg;\n const templ = cfg.templating || {};\n const needsPrimary = !templ.primary;\n if (!needsPrimary) return cfg; // respect user config\n\n const pickBy = (preds: RegExp[]): string | undefined =>\n names.find((n) => preds.some((p) => p.test(String(n)))) || undefined;\n\n const primaryName =\n pickBy([/nomeCompleto/i, /nome/i, /title/i, /name/i, /label/i]) || names[0];\n const secondaryName =\n names.find((n) => n !== primaryName && /(email|cpf|desc|resumo|cargo|departamento)/i.test(n)) ||\n names.find((n) => n !== primaryName);\n const trailingName = pickBy([/status/i, /tag/i, /state/i, /ativo/i]);\n\n const newCfg = produce(cfg, (draft) => {\n const t: any = { ...(draft.templating as any) };\n t.primary = makeText(primaryName);\n if (secondaryName) {\n t.secondary = makeText(secondaryName);\n draft.layout = draft.layout || ({} as any);\n const cur = Number((draft.layout as any).lines) || 1;\n (draft.layout as any).lines = Math.max(cur, 2) as any;\n }\n if (trailingName) {\n // Use meta for chips to align with current UI (right-side block renders meta).\n t.meta = makeChip(trailingName);\n }\n (draft as any).templating = t;\n });\n return newCfg;\n}\n\nfunction makeText(field: string): TemplateDef {\n return { type: 'text', expr: '${item.' + field + '}' } as any;\n}\nfunction makeChip(field: string): TemplateDef {\n return { type: 'chip', expr: '${item.' + field + '}' } as any;\n}\n","import { Component, Inject, Input, DoCheck, inject } from '@angular/core';\nimport { BehaviorSubject, Subject, of } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, tap, catchError } from 'rxjs/operators';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { PraxisListConfig, TemplateDef } from '../models/list-config.model';\nimport { SETTINGS_PANEL_DATA, SettingsValueProvider } from '@praxisui/settings-panel';\nimport { PraxisListSkinPreviewComponent } from '../components/list-skin-preview.component';\nimport { GenericCrudService, IconPickerService, PraxisIconDirective } from '@praxisui/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { produce } from 'immer';\nimport { inferTemplatingFromSchema } from '../utils/templating-inference';\n\ntype NormalizedListConfig = Omit<\n PraxisListConfig,\n 'dataSource' | 'layout' | 'selection' | 'skin' | 'i18n'\n> & {\n dataSource: { data?: any[]; resourcePath?: string; query?: Record<string, any>; sort?: string[] };\n layout: {\n variant: 'list' | 'cards';\n density?: 'default' | 'comfortable' | 'compact';\n lines: 1 | 2 | 3;\n dividers?: 'none' | 'between' | 'all';\n model?: 'standard' | 'media' | 'hotel';\n groupBy?: string;\n stickySectionHeader?: boolean;\n virtualScroll?: boolean;\n pageSize?: number;\n };\n skin: {\n type: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'custom';\n gradient: { from: string; to: string; angle?: number };\n radius?: string;\n shadow?: string;\n border?: string;\n backdropBlur?: string;\n class?: string;\n inlineStyle?: string;\n };\n selection: {\n mode: 'none' | 'single' | 'multiple';\n formControlName?: string;\n formControlPath?: string;\n compareBy?: string;\n return?: 'value' | 'item' | 'id';\n };\n i18n: { locale?: string; currency?: string };\n actions?: PraxisListConfig['actions'];\n};\n\n@Component({\n selector: 'praxis-list-config-editor',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatTabsModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatButtonModule,\n MatSlideToggleModule,\n MatIconModule,\n MatExpansionModule,\n MatButtonToggleModule,\n MatTooltipModule,\n MatDividerModule,\n MatChipsModule,\n PraxisIconDirective,\n PraxisListSkinPreviewComponent,\n ],\n template: `\n <mat-tab-group>\n <mat-tab label=\"Dados\">\n <div class=\"p-3\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>resourcePath</mat-label>\n <input matInput [(ngModel)]=\"working.dataSource.resourcePath\" (ngModelChange)=\"onResourcePathChange($event)\" placeholder=\"ex.: users\" />\n </mat-form-field>\n <div class=\"g g-auto-220 gap-12 ai-end mt-12\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Itens por página</mat-label>\n <input matInput type=\"number\" min=\"1\" [(ngModel)]=\"working.layout.pageSize\" (ngModelChange)=\"onPageSizeChange($event)\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Ordenar por (campo)</mat-label>\n <mat-select [(ngModel)]=\"sortField\" (ngModelChange)=\"updateSortConfig()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Direção</mat-label>\n <mat-select [(ngModel)]=\"sortDir\" (ngModelChange)=\"updateSortConfig()\">\n <mat-option value=\"asc\">Ascendente</mat-option>\n <mat-option value=\"desc\">Descendente</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"Ações\">\n <div class=\"p-3 g gap-12\">\n <div class=\"g g-1-auto gap-8 ai-center\">\n <div class=\"muted\">Configure botões de ação por item (ícone, rótulo, cor, visibilidade)</div>\n <button mat-flat-button color=\"primary\" (click)=\"addAction()\">Adicionar ação</button>\n </div>\n <div *ngFor=\"let a of (working.actions || []); let i = index\" class=\"g g-auto-200 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>ID</mat-label>\n <input matInput [(ngModel)]=\"a.id\" (ngModelChange)=\"onActionsChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"a.kind\" (ngModelChange)=\"onActionsChanged()\">\n <mat-option value=\"icon\">Ícone</mat-option>\n <mat-option value=\"button\">Botão</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone</mat-label>\n <input matInput [(ngModel)]=\"a.icon\" (ngModelChange)=\"onActionsChanged()\" placeholder=\"ex.: edit, delete\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Rótulo</mat-label>\n <input matInput [(ngModel)]=\"a.label\" (ngModelChange)=\"onActionsChanged()\" />\n </mat-form-field>\n <ng-container *ngIf=\"a.kind === 'button'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Variante</mat-label>\n <mat-select [(ngModel)]=\"a.buttonVariant\" (ngModelChange)=\"onActionsChanged()\">\n <mat-option value=\"stroked\">Stroked</mat-option>\n <mat-option value=\"raised\">Raised</mat-option>\n <mat-option value=\"flat\">Flat</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor</mat-label>\n <mat-select [(ngModel)]=\"a.color\" (ngModelChange)=\"onActionsChanged()\">\n <mat-option [value]=\"undefined\">Default</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"col-span-2\">\n <mat-label>Visível quando (ex.: ${item.status} == 'done')</mat-label>\n <input matInput [(ngModel)]=\"a.showIf\" (ngModelChange)=\"onActionsChanged()\" />\n </mat-form-field>\n <div class=\"g row-flow gap-8 ai-center\">\n <button *ngIf=\"(a.kind || 'icon') === 'icon'\" mat-icon-button [color]=\"a.color || undefined\"><mat-icon [praxisIcon]=\"a.icon || 'bolt'\"></mat-icon></button>\n <ng-container *ngIf=\"a.kind === 'button'\">\n <button *ngIf=\"a.buttonVariant === 'stroked'\" mat-stroked-button [color]=\"a.color || undefined\">{{ a.label || a.id || 'Ação' }}</button>\n <button *ngIf=\"a.buttonVariant === 'raised'\" mat-raised-button [color]=\"a.color || undefined\">{{ a.label || a.id || 'Ação' }}</button>\n <button *ngIf=\"!a.buttonVariant || a.buttonVariant === 'flat'\" mat-flat-button [color]=\"a.color || undefined\">{{ a.label || a.id || 'Ação' }}</button>\n </ng-container>\n <span class=\"muted\">Pré-visualização</span>\n </div>\n <div class=\"flex-end\">\n <button mat-button color=\"warn\" (click)=\"removeAction(i)\">Remover</button>\n </div>\n </div>\n </div>\n </mat-tab>\n <mat-tab label=\"Layout\">\n <div class=\"p-3 grid gap-3\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Variante</mat-label>\n <mat-select [(ngModel)]=\"working.layout.variant\" (ngModelChange)=\"onLayoutChanged()\">\n <mat-option value=\"list\">Lista</mat-option>\n <mat-option value=\"cards\">Cards</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Modelo</mat-label>\n <mat-select [(ngModel)]=\"working.layout.model\" (ngModelChange)=\"onLayoutChanged()\">\n <ng-container *ngIf=\"working.layout.variant === 'list'; else cardModels\">\n <mat-option value=\"standard\">Padrão</mat-option>\n <mat-option value=\"media\">Mídia à esquerda</mat-option>\n <mat-option value=\"hotel\">Hotel (mídia grande)</mat-option>\n </ng-container>\n <ng-template #cardModels>\n <mat-option value=\"standard\">Padrão</mat-option>\n <mat-option value=\"media\">Card com mídia</mat-option>\n <mat-option value=\"hotel\">Hotel</mat-option>\n </ng-template>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Linhas</mat-label>\n <mat-select [(ngModel)]=\"working.layout.lines\" (ngModelChange)=\"onLayoutChanged()\">\n <mat-option [value]=\"1\">1</mat-option>\n <mat-option [value]=\"2\">2</mat-option>\n <mat-option [value]=\"3\">3</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"fields.length > 0; else groupByText\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Group by</mat-label>\n <mat-select [(ngModel)]=\"working.layout.groupBy\" (ngModelChange)=\"onLayoutChanged()\">\n <mat-option [value]=\"\">Nenhum</mat-option>\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #groupByText>\n <mat-form-field appearance=\"outline\">\n <mat-label>Group by</mat-label>\n <input matInput [(ngModel)]=\"working.layout.groupBy\" (ngModelChange)=\"onLayoutChanged()\" placeholder=\"ex.: departamento\" />\n </mat-form-field>\n </ng-template>\n <mat-slide-toggle [(ngModel)]=\"working.layout.stickySectionHeader\" (ngModelChange)=\"onLayoutChanged()\">\n Header de seção sticky\n </mat-slide-toggle>\n </div>\n </mat-tab>\n <mat-tab label=\"Templates\">\n <div class=\"p-3 grid gap-3\">\n <mat-accordion multi>\n <mat-expansion-panel expanded>\n <mat-expansion-panel-header>\n <mat-panel-title>Primary (Título)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Título (primary)</mat-label>\n <mat-select [(ngModel)]=\"mappingPrimary.field\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"mappingPrimary.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"currency\">Moeda</mat-option>\n <mat-option value=\"date\">Data</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingPrimary.type==='currency'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.currencyCode\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingPrimary.type==='date'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Formato</mat-label>\n <mat-select [(ngModel)]=\"mappingPrimary.dateStyle\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"short\">Curto</mat-option>\n <mat-option value=\"medium\">Médio</mat-option>\n <mat-option value=\"long\">Longo</mat-option>\n <mat-option value=\"full\">Completo</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.class\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style inline</mat-label>\n <input matInput [(ngModel)]=\"mappingPrimary.style\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n </div>\n <mat-divider class=\"my-8\"></mat-divider>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Secondary (Resumo)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Resumo (secondary)</mat-label>\n <mat-select [(ngModel)]=\"mappingSecondary.field\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"mappingSecondary.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"currency\">Moeda</mat-option>\n <mat-option value=\"date\">Data</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingSecondary.type==='currency'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.currencyCode\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingSecondary.type==='date'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Formato</mat-label>\n <mat-select [(ngModel)]=\"mappingSecondary.dateStyle\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"short\">Curto</mat-option>\n <mat-option value=\"medium\">Médio</mat-option>\n <mat-option value=\"long\">Longo</mat-option>\n <mat-option value=\"full\">Completo</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.class\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style inline</mat-label>\n <input matInput [(ngModel)]=\"mappingSecondary.style\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Meta (lado/detalhe)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Meta</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.field\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"currency\">Moeda</mat-option>\n <mat-option value=\"date\">Data</mat-option>\n <mat-option value=\"chip\">Chip</mat-option>\n <mat-option value=\"rating\">Rating</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingMeta.type==='chip'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do chip</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.chipColor\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option [value]=\"undefined\">Default</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Estilo do chip</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.chipVariant\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"filled\">Preenchido</mat-option>\n <mat-option value=\"outlined\">Contorno</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.class\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style inline</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.style\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Posição do meta</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.placement\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"side\">Lateral</mat-option>\n <mat-option value=\"line\">Terceira linha</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone do meta (prefixo)</mat-label>\n <input matInput [(ngModel)]=\"mappingMetaPrefixIcon\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: schedule\" />\n <button mat-icon-button color=\"primary\" matSuffix type=\"button\" (click)=\"pickMetaPrefixIcon()\" aria-label=\"Escolher ícone\"><mat-icon>search</mat-icon></button>\n </mat-form-field>\n <ng-container *ngIf=\"mappingMeta.type==='currency'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.currencyCode\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingMeta.type==='date'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingMeta.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Formato</mat-label>\n <mat-select [(ngModel)]=\"mappingMeta.dateStyle\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"short\">Curto</mat-option>\n <mat-option value=\"medium\">Médio</mat-option>\n <mat-option value=\"long\">Longo</mat-option>\n <mat-option value=\"full\">Completo</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Trailing (lado direito)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Trailing</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.field\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Tipo</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"text\">Texto</mat-option>\n <mat-option value=\"chip\">Chip</mat-option>\n <mat-option value=\"currency\">Moeda</mat-option>\n <mat-option value=\"date\">Data</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingTrailing.type==='chip'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do chip</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.chipColor\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option [value]=\"undefined\">Default</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Estilo do chip</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.chipVariant\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"filled\">Preenchido</mat-option>\n <mat-option value=\"outlined\">Contorno</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingTrailing.type==='currency'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.currencyCode\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingTrailing.type==='date'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.locale\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Formato</mat-label>\n <mat-select [(ngModel)]=\"mappingTrailing.dateStyle\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"short\">Curto</mat-option>\n <mat-option value=\"medium\">Médio</mat-option>\n <mat-option value=\"long\">Longo</mat-option>\n <mat-option value=\"full\">Completo</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.class\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style inline</mat-label>\n <input matInput [(ngModel)]=\"mappingTrailing.style\" (ngModelChange)=\"onMappingChanged()\" />\n </mat-form-field>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Leading (ícone/imagem)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Leading</mat-label>\n <mat-select [(ngModel)]=\"mappingLeading.type\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"icon\">Ícone</mat-option>\n <mat-option value=\"image\">Imagem</mat-option>\n </mat-select>\n </mat-form-field>\n <ng-container *ngIf=\"mappingLeading.type==='icon'\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone (leading)</mat-label>\n <input matInput [(ngModel)]=\"mappingLeading.icon\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: face\" />\n <button mat-icon-button color=\"primary\" matSuffix type=\"button\" (click)=\"pickLeadingIcon()\" aria-label=\"Escolher ícone\"><mat-icon>search</mat-icon></button>\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"mappingLeading.type==='image'\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Imagem (URL/expr)</mat-label>\n <input matInput [(ngModel)]=\"mappingLeading.imageUrl\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: \\${item.photoUrl}\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Badge (texto)</mat-label>\n <input matInput [(ngModel)]=\"mappingLeading.badgeText\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: 50% OFF\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Cor do badge</mat-label>\n <mat-select [(ngModel)]=\"mappingLeading.badgeColor\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option [value]=\"undefined\">Default</mat-option>\n <mat-option value=\"primary\">Primary</mat-option>\n <mat-option value=\"accent\">Accent</mat-option>\n <mat-option value=\"warn\">Warn</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Estilo do badge</mat-label>\n <mat-select [(ngModel)]=\"mappingLeading.badgeVariant\" (ngModelChange)=\"onMappingChanged()\">\n <mat-option value=\"filled\">Preenchido</mat-option>\n <mat-option value=\"outlined\">Contorno</mat-option>\n </mat-select>\n </mat-form-field>\n </ng-container>\n </div>\n </mat-expansion-panel>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>Meta e Features (compor + linha)</mat-panel-title>\n </mat-expansion-panel-header>\n <div class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Campos</mat-label>\n <mat-select [(ngModel)]=\"mappingMetaFields\" (ngModelChange)=\"onMappingChanged()\" multiple>\n <mat-option *ngFor=\"let f of fields\" [value]=\"f\">{{ f }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Separador</mat-label>\n <input matInput [(ngModel)]=\"mappingMetaSeparator\" (ngModelChange)=\"onMappingChanged()\" placeholder=\"ex.: •\" />\n </mat-form-field>\n <mat-slide-toggle [(ngModel)]=\"mappingMetaWrapSecondInParens\" (ngModelChange)=\"onMappingChanged()\">Segundo campo entre parênteses</mat-slide-toggle>\n </div>\n <div class=\"text-caption mt-12\">Ao aplicar, o Meta (texto) usará a expressão composta com os campos selecionados.</div>\n <div class=\"section-title mat-subtitle-1 text-caption subtitle\">Prévia: {{ metaComposePreview() }}</div>\n <div class=\"g row-flow gap-12 ai-center my-8\">\n <button mat-flat-button color=\"primary\" (click)=\"generateFeaturesFromMetaComposition()\" [disabled]=\"!mappingMetaFields.length\">Gerar features a partir do Meta</button>\n <mat-slide-toggle [(ngModel)]=\"featuresSyncWithMeta\" (ngModelChange)=\"onMappingChanged()\">Sincronizar features com Meta</mat-slide-toggle>\n <span class=\"muted\" *ngIf=\"mappingMetaFields.length\">Cria/atualiza uma feature para cada campo composto, com ícone sugerido.</span>\n </div>\n\n <div class=\"section-title mat-subtitle-1 subtitle\">Linha de Features</div>\n <div class=\"g g-1-auto gap-8 ai-center mb-8\">\n <div class=\"g row-flow gap-12 ai-center\">\n <mat-slide-toggle [(ngModel)]=\"featuresVisible\" (ngModelChange)=\"onFeaturesChanged()\">Mostrar features</mat-slide-toggle>\n <mat-button-toggle-group [(ngModel)]=\"featuresMode\" (change)=\"onFeaturesChanged()\" appearance=\"legacy\">\n <mat-button-toggle [value]=\"'icons+labels'\" matTooltip=\"Ícone + texto\"><mat-icon>view_list</mat-icon></mat-button-toggle>\n <mat-button-toggle [value]=\"'icons-only'\" matTooltip=\"Apenas ícones\"><mat-icon>more_horiz</mat-icon></mat-button-toggle>\n <mat-button-toggle [value]=\"'labels-only'\" matTooltip=\"Apenas texto\"><mat-icon>short_text</mat-icon></mat-button-toggle>\n </mat-button-toggle-group>\n <span class=\"muted\" *ngIf=\"featuresSyncWithMeta\">Sincronizado com Meta</span>\n </div>\n <button mat-flat-button color=\"primary\" (click)=\"addFeature()\">Adicionar feature</button>\n </div>\n <div *ngFor=\"let f of features; let i = index\" class=\"g g-auto-200 gap-12 ai-end mb-6\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Ícone</mat-label>\n <input matInput [(ngModel)]=\"f.icon\" (ngModelChange)=\"onFeaturesChanged()\" placeholder=\"ex.: wifi\" />\n <button mat-icon-button color=\"primary\" matSuffix type=\"button\" (click)=\"pickFeatureIcon(i)\" aria-label=\"Escolher ícone\"><mat-icon>search</mat-icon></button>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"col-span-2\">\n <mat-label>Rótulo (expressão)</mat-label>\n <input #featureExprInput matInput [(ngModel)]=\"f.expr\" (ngModelChange)=\"onFeaturesChanged()\" placeholder=\"ex.: \\${item.stars}-Star Hotel\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe</mat-label>\n <input matInput [(ngModel)]=\"f.class\" (ngModelChange)=\"onFeaturesChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Style</mat-label>\n <input matInput [(ngModel)]=\"f.style\" (ngModelChange)=\"onFeaturesChanged()\" />\n </mat-form-field>\n <div class=\"flex-end\">\n <button mat-button color=\"warn\" (click)=\"removeFeature(i)\">Remover</button>\n </div>\n <div class=\"col-span-3\">\n <div class=\"section-title mat-subtitle-1 text-caption subtitle\">Inserir (Meta selecionado)</div>\n <div class=\"g gap-6 ai-center\">\n <div *ngIf=\"mappingMetaFields.length\" class=\"chips-row\">\n <span class=\"muted text-caption\">Meta selecionado:</span>\n <mat-chip-set aria-label=\"Campos selecionados no Meta\">\n <mat-chip color=\"primary\" selected *ngFor=\"let mf of mappingMetaFields\" (click)=\"insertFeatureToken(i, featureExprInput, mf)\" [matTooltip]=\"'Inserir $' + '{item.' + mf + '}'\">{{ mf }}</mat-chip>\n </mat-chip-set>\n </div>\n </div>\n </div>\n </div>\n </mat-expansion-panel>\n </mat-accordion>\n\n <button mat-flat-button color=\"primary\" (click)=\"applyTemplate()\">Aplicar mapeamento</button>\n <button mat-button (click)=\"inferFromFields()\" [disabled]=\"!fields.length\">Inferir do schema</button>\n </div>\n\n <div class=\"g g-1-auto ai-center\">\n <div class=\"g row-flow gap-8 ai-center\">\n <span class=\"section-title mat-subtitle-1\">Preview Theme</span>\n <mat-button-toggle-group [(ngModel)]=\"skinPreviewTheme\" (change)=\"onSkinChanged()\" appearance=\"legacy\">\n <mat-button-toggle [value]=\"'light'\">Light</mat-button-toggle>\n <mat-button-toggle [value]=\"'dark'\">Dark</mat-button-toggle>\n <mat-button-toggle [value]=\"'grid'\">Grid</mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n <div class=\"skin-preview-wrap\">\n <praxis-list-skin-preview [config]=\"working\" [items]=\"previewData\" [theme]=\"skinPreviewTheme\"></praxis-list-skin-preview>\n </div>\n </div>\n \n </mat-tab>\n <mat-tab label=\"i18n/A11y\">\n <div class=\"p-3 grid gap-3\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Locale padrão</mat-label>\n <input matInput [(ngModel)]=\"working.i18n.locale\" (ngModelChange)=\"markDirty()\" placeholder=\"ex.: pt-BR\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Moeda padrão</mat-label>\n <input matInput [(ngModel)]=\"working.i18n.currency\" (ngModelChange)=\"markDirty()\" placeholder=\"ex.: BRL\" />\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab label=\"Seleção\">\n <div class=\"p-3 grid gap-3\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Modo</mat-label>\n <mat-select [(ngModel)]=\"working.selection.mode\" (ngModelChange)=\"onSelectionChanged()\">\n <mat-option value=\"none\">Sem seleção</mat-option>\n <mat-option value=\"single\">Single</mat-option>\n <mat-option value=\"multiple\">Multiple</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>FormControl name</mat-label>\n <input matInput [(ngModel)]=\"working.selection.formControlName\" (ngModelChange)=\"onSelectionChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>compareBy</mat-label>\n <input matInput [(ngModel)]=\"working.selection.compareBy\" (ngModelChange)=\"onSelectionChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Retorno</mat-label>\n <mat-select [(ngModel)]=\"working.selection.return\" (ngModelChange)=\"onSelectionChanged()\">\n <mat-option value=\"value\">value</mat-option>\n <mat-option value=\"item\">item</mat-option>\n <mat-option value=\"id\">id</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </mat-tab>\n <mat-tab label=\"Skins\">\n <div class=\"p-3 grid gap-3\">\n <div class=\"preset-row g row-flow gap-8\">\n <button mat-button (click)=\"applySkinPreset('pill-soft')\">Pill Soft</button>\n <button mat-button (click)=\"applySkinPreset('gradient-tile')\">Gradient Tile</button>\n <button mat-button (click)=\"applySkinPreset('glass')\">Glass</button>\n <button mat-button (click)=\"applySkinPreset('elevated')\">Elevated</button>\n <button mat-button (click)=\"applySkinPreset('outline')\">Outline</button>\n <button mat-button (click)=\"applySkinPreset('flat')\">Flat</button>\n <button mat-button (click)=\"applySkinPreset('neumorphism')\">Neumorphism</button>\n </div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Skin</mat-label>\n <mat-select [(ngModel)]=\"working.skin.type\" (ngModelChange)=\"onSkinChanged()\">\n <mat-option value=\"pill-soft\">Pill Soft</mat-option>\n <mat-option value=\"gradient-tile\">Gradient Tile</mat-option>\n <mat-option value=\"glass\">Glass</mat-option>\n <mat-option value=\"elevated\">Elevated</mat-option>\n <mat-option value=\"custom\">Custom</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Radius</mat-label>\n <input matInput [(ngModel)]=\"working.skin.radius\" (ngModelChange)=\"onSkinChanged()\" placeholder=\"ex.: 1.25rem\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Shadow</mat-label>\n <input matInput [(ngModel)]=\"working.skin.shadow\" (ngModelChange)=\"onSkinChanged()\" placeholder=\"ex.: 0 10px 30px rgba(0,0,0,.12)\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Border</mat-label>\n <input matInput [(ngModel)]=\"working.skin.border\" (ngModelChange)=\"onSkinChanged()\" />\n </mat-form-field>\n <mat-form-field *ngIf=\"working.skin.type==='glass'\" appearance=\"outline\">\n <mat-label>Blur</mat-label>\n <input matInput [(ngModel)]=\"working.skin.backdropBlur\" (ngModelChange)=\"onSkinChanged()\" placeholder=\"e.g. 8px\" />\n </mat-form-field>\n <div *ngIf=\"working.skin.type==='gradient-tile'\" class=\"g gap-12\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Gradient from</mat-label>\n <input matInput [(ngModel)]=\"working.skin.gradient.from\" (ngModelChange)=\"onSkinChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Gradient to</mat-label>\n <input matInput [(ngModel)]=\"working.skin.gradient.to\" (ngModelChange)=\"onSkinChanged()\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Angle</mat-label>\n <input matInput type=\"number\" [(ngModel)]=\"working.skin.gradient.angle\" (ngModelChange)=\"onSkinChanged()\" />\n </mat-form-field>\n </div>\n\n <div *ngIf=\"working.skin.type==='custom'\" class=\"g g-auto-220 gap-12 ai-end\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Classe CSS (skin.class)</mat-label>\n <input matInput [(ngModel)]=\"working.skin.class\" (ngModelChange)=\"onSkinChanged()\" placeholder=\"ex.: my-list-skin\" />\n </mat-form-field>\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Style inline (skin.inlineStyle)</mat-label>\n <textarea matInput rows=\"4\" [(ngModel)]=\"working.skin.inlineStyle\" (ngModelChange)=\"onSkinChanged()\" [attr.placeholder]=\"':host{--p-list-radius: 1rem}'\"></textarea>\n </mat-form-field>\n <div class=\"text-caption\">\n Exemplo de CSS por classe (adicione no seu styles global):\n <pre class=\"code-block\">.my-list-skin .item-card {\n border-radius: 14px;\n border: 1px solid rgba(0,0,0,.12);\n box-shadow: 0 10px 24px rgba(0,0,0,.12);\n}\n.my-list-skin .mat-mdc-list-item .list-item-content {\n backdrop-filter: blur(6px);\n}</pre>\n </div>\n </div>\n\n \n </div>\n </mat-tab>\n </mat-tab-group>\n `,\n styles: [`\n .g{display:grid}\n .g-auto-220{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}\n .g-auto-200{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}\n .g-1-auto{grid-template-columns:1fr auto}\n .row-flow{grid-auto-flow:column}\n .gap-6{gap:6px}\n .gap-8{gap:8px}\n .gap-12{gap:12px}\n .ai-center{align-items:center}\n .ai-end{align-items:end}\n .mt-12{margin-top:12px}\n .mb-8{margin-bottom:8px}\n .mb-6{margin-bottom:6px}\n .my-8{margin:8px 0}\n .subtitle{margin:8px 0 4px;opacity:.82}\n .chips-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center}\n `]\n})\nexport class PraxisListConfigEditor implements SettingsValueProvider, DoCheck {\n @Input() config!: PraxisListConfig;\n @Input() listId?: string;\n\n working: NormalizedListConfig = {\n dataSource: {},\n layout: { variant: 'list', lines: 2, density: 'default', dividers: 'between' },\n selection: { mode: 'none', return: 'value' },\n skin: { type: 'elevated', gradient: { from: '', to: '', angle: 135 } },\n i18n: { locale: 'en-US', currency: 'USD' },\n };\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$ = new BehaviorSubject<boolean>(true);\n isBusy$ = new BehaviorSubject<boolean>(false);\n\n private initialJson = '';\n private lastJson = '';\n\n fields: string[] = [];\n private lastResourcePath?: string; // kept for backwards safety; watcher supersedes\n sortField?: string;\n sortDir: 'asc' | 'desc' = 'asc';\n mappingPrimary: { field?: string; type: 'text'|'currency'|'date'; currencyCode?: string; locale?: string; dateStyle?: 'short'|'medium'|'long'|'full'; class?: string; style?: string } = { type: 'text' } as any;\n mappingSecondary: { field?: string; type: 'text'|'currency'|'date'; currencyCode?: string; locale?: string; dateStyle?: 'short'|'medium'|'long'|'full'; class?: string; style?: string } = { type: 'text' } as any;\n mappingMeta: { field?: string; type: 'text'|'currency'|'date'|'chip'|'rating'; currencyCode?: string; locale?: string; dateStyle?: 'short'|'medium'|'long'|'full'; class?: string; style?: string; placement?: 'side'|'line'; chipColor?: string; chipVariant?: 'filled'|'outlined' } = { type: 'text' } as any;\n mappingMetaPrefixIcon?: string;\n mappingTrailing: { field?: string; type?: 'text'|'currency'|'date'|'chip'; class?: string; style?: string; chipColor?: string; chipVariant?: 'filled'|'outlined'; currencyCode?: string; locale?: string; dateStyle?: 'short'|'medium'|'long'|'full' } = {} as any;\n mappingLeading: { type: 'icon'|'image'; icon?: string; imageUrl?: string; badgeText?: string; badgeColor?: string; badgeVariant?: 'filled'|'outlined' } = { type: 'icon' } as any;\n mapping: { leadingIcon?: string } = {};\n private mappingDirty = false;\n\n // Meta composition (multi-field)\n mappingMetaFields: string[] = [];\n mappingMetaSeparator: string = ' • ';\n mappingMetaWrapSecondInParens = false;\n featuresSyncWithMeta = false;\n\n // Features editor state\n features: Array<{ icon?: string; expr: string; class?: string; style?: string }> = [];\n featuresVisible = true;\n featuresMode: 'icons+labels'|'icons-only'|'labels-only' = 'icons+labels';\n\n private crud: GenericCrudService<any> | null = null;\n private resourcePathChanges = new Subject<string>();\n\n constructor(@Inject(SETTINGS_PANEL_DATA) injected?: any) {\n // optional inject\n this.crud = inject(GenericCrudService as any, { optional: true }) as GenericCrudService<any> | null;\n const cfg = (injected?.config as PraxisListConfig) || this.config;\n if (cfg) {\n this.working = this.normalize(structuredClone(cfg));\n // Initialize mapping UI from existing templating\n this.hydrateMappingFromTemplating(this.working.templating as any);\n }\n this.initialJson = JSON.stringify(this.working);\n this.lastJson = this.initialJson;\n // Start schema watcher and emit initial value\n this.setupSchemaWatcher();\n this.resourcePathChanges.next(this.working?.dataSource?.resourcePath || '');\n // Hydrate sort controls from existing config\n const sort = this.working.dataSource?.sort?.[0];\n if (sort && typeof sort === 'string') {\n const [field, dir] = sort.split(',');\n this.sortField = field;\n this.sortDir = (dir === 'desc' ? 'desc' : 'asc');\n }\n }\n\n private ip = inject(IconPickerService);\n async pickLeadingIcon(): Promise<void> {\n const chosen = await this.ip.openDialog({ value: (this.mappingLeading as any)?.icon });\n if (chosen == null) return;\n this.mappingLeading = { ...(this.mappingLeading || { type: 'icon' as const }), type: 'icon', icon: chosen } as any;\n this.onMappingChanged();\n }\n async pickFeatureIcon(index: number): Promise<void> {\n const current = (this.features?.[index]?.icon) || '';\n const chosen = await this.ip.openDialog({ value: current });\n if (chosen == null) return;\n const arr = [...(this.features || [])];\n const old = arr[index] || { icon: '', expr: '' };\n arr[index] = { ...old, icon: chosen };\n this.features = arr;\n this.onFeaturesChanged();\n }\n async pickMetaPrefixIcon(): Promise<void> {\n const chosen = await this.ip.openDialog({ value: this.mappingMetaPrefixIcon || '' });\n if (chosen == null) return;\n this.mappingMetaPrefixIcon = chosen;\n this.onMappingChanged();\n }\n\n getSettingsValue(): any {\n // Ensure pending template mapping is applied before returning\n this.ensureMappingApplied();\n return { config: this.working, id: this.listId };\n }\n\n onSave(): any {\n this.ensureMappingApplied();\n return { config: this.working, id: this.listId };\n }\n\n private normalize(cfg: PraxisListConfig): NormalizedListConfig {\n const out: NormalizedListConfig = {\n ...cfg,\n dataSource: cfg.dataSource || {},\n layout: {\n variant: (cfg.layout?.variant as any) || 'list',\n lines: (cfg.layout?.lines as any) || 2,\n density: cfg.layout?.density || 'default',\n dividers: cfg.layout?.dividers || 'between',\n model: (cfg.layout?.model as any) || 'standard',\n groupBy: cfg.layout?.groupBy,\n stickySectionHeader: cfg.layout?.stickySectionHeader,\n virtualScroll: cfg.layout?.virtualScroll,\n },\n selection: {\n mode: cfg.selection?.mode || 'none',\n formControlName: cfg.selection?.formControlName,\n formControlPath: cfg.selection?.formControlPath,\n compareBy: cfg.selection?.compareBy,\n return: cfg.selection?.return || 'value',\n },\n skin: {\n type: (cfg.skin?.type as any) || 'elevated',\n gradient: cfg.skin?.gradient || { from: '', to: '', angle: 135 },\n radius: cfg.skin?.radius,\n shadow: cfg.skin?.shadow,\n border: cfg.skin?.border,\n backdropBlur: cfg.skin?.backdropBlur,\n class: cfg.skin?.class,\n },\n i18n: (cfg.i18n as any) || {},\n };\n return out;\n }\n\n // Debounced schema loader for resourcePath\n private setupSchemaWatcher(): void {\n this.resourcePathChanges\n .pipe(\n debounceTime(300),\n distinctUntilChanged(),\n tap(() => this.isBusy$.next(true)),\n switchMap((rp) => {\n const path = (rp || '').trim();\n if (!path || !this.crud) {\n this.fields = [];\n return of([]);\n }\n try {\n this.crud.configure(path);\n return this.crud.getSchema().pipe(catchError(() => of([])));\n } catch {\n return of([]);\n }\n }),\n takeUntilDestroyed(),\n )\n .subscribe((fields: any) => {\n this.fields = (fields || [])\n .map((f: any) => f?.name || f?.field || f?.key)\n .filter((n: any) => !!n) as string[];\n this.isBusy$.next(false);\n this.verify();\n });\n }\n\n onResourcePathChange(value: string): void {\n this.resourcePathChanges.next(value ?? '');\n this.markDirty();\n this.verify();\n }\n\n applySkinPreset(preset: 'pill-soft' | 'gradient-tile' | 'glass' | 'elevated' | 'outline' | 'flat' | 'neumorphism'): void {\n const currentClass = this.working?.skin?.class;\n this.working = produce(this.working, (draft) => {\n switch (preset) {\n case 'pill-soft':\n draft.skin = {\n type: 'pill-soft',\n radius: '1.5rem',\n shadow: '0 6px 20px rgba(0,0,0,0.08)',\n border: '1px solid rgba(0,0,0,0.06)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'gradient-tile':\n draft.skin = {\n type: 'gradient-tile',\n gradient: { from: '#FFAA70', to: '#8E72FF', angle: 135 },\n radius: '1rem',\n shadow: '0 10px 30px rgba(0,0,0,0.12)',\n class: currentClass,\n } as any;\n break;\n case 'glass':\n draft.skin = {\n type: 'glass',\n radius: '1rem',\n border: '1px solid rgba(255,255,255,0.33)',\n backdropBlur: '12px',\n shadow: '0 6px 20px rgba(0,0,0,0.08)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'elevated':\n default:\n draft.skin = {\n type: 'elevated',\n radius: '0.75rem',\n shadow: '0 6px 20px rgba(0,0,0,0.08)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'outline':\n draft.skin = {\n type: 'elevated',\n radius: '0.75rem',\n shadow: 'none',\n border: '1px solid rgba(0,0,0,0.2)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'flat':\n draft.skin = {\n type: 'elevated',\n radius: '0.5rem',\n shadow: 'none',\n border: '1px solid rgba(0,0,0,0.08)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n case 'neumorphism':\n draft.skin = {\n type: 'elevated',\n radius: '1.25rem',\n shadow: '8px 8px 20px rgba(0,0,0,0.08), -8px -8px 20px rgba(255,255,255,0.6)',\n border: '1px solid rgba(255,255,255,0.35)',\n gradient: { from: '', to: '', angle: 135 },\n class: currentClass,\n } as any;\n break;\n }\n });\n this.markDirty();\n this.verify();\n }\n\n previewData = [\n { title: 'Maria', subtitle: 'Product Designer', tag: 'A+', salary: 12345.67, hireDate: '2022-03-01', rating: 4.5 },\n { title: 'João', subtitle: 'Frontend Engineer', tag: 'B', salary: 9876.0, hireDate: '2023-01-12', rating: 3.8 },\n { title: 'Ana', subtitle: 'QA Analyst', tag: 'C', salary: 7564.32, hireDate: '2021-10-05', rating: 4.9 },\n ];\n skinPreviewTheme: 'light'|'dark'|'grid' = 'light';\n\n addAction(): void {\n this.working = produce(this.working, (draft: any) => {\n draft.actions = draft.actions || [];\n draft.actions.push({ id: 'newAction', icon: 'bolt', label: 'Ação', color: undefined, kind: 'icon' });\n });\n this.markDirty();\n this.verify();\n }\n removeAction(idx: number): void {\n this.working = produce(this.working, (draft: any) => {\n if (Array.isArray(draft.actions)) draft.actions.splice(idx, 1);\n });\n this.markDirty();\n this.verify();\n }\n onActionsChanged(): void {\n this.markDirty();\n this.verify();\n }\n\n ngDoCheck(): void {\n // Lightweight dirty tracking relying on lastJson updated by markDirty()\n // Leave empty to avoid heavy work each CD; explicit mutation handlers call markDirty() and verify().\n }\n\n reset(): void {\n try {\n this.isBusy$.next(true);\n const parsed = JSON.parse(this.initialJson);\n this.working = parsed;\n this.lastJson = this.initialJson;\n this.isDirty$.next(false);\n this.isValid$.next(true);\n } finally {\n this.isBusy$.next(false);\n }\n }\n\n onLayoutChanged(): void {\n this.markDirty();\n this.verify();\n }\n\n onSelectionChanged(): void {\n this.markDirty();\n this.verify();\n }\n\n onSkinChanged(): void {\n this.markDirty();\n }\n\n onPageSizeChange(value: any): void {\n const n = Number(value);\n const fixed = !Number.isFinite(n) || n < 1 ? 1 : Math.floor(n);\n this.working = produce(this.working, (draft) => {\n (draft.layout as any).pageSize = fixed;\n });\n this.markDirty();\n this.verify();\n }\n\n // Legacy method retained to avoid breaking references; no-op now.\n private loadFieldsIfNeeded(): void { /* replaced by setupSchemaWatcher */ }\n\n updateSortConfig(): void {\n const field = (this.sortField || '').trim();\n const dir = this.sortDir || 'asc';\n this.working = produce(this.working, (draft) => {\n draft.dataSource = draft.dataSource || ({} as any);\n if (field) draft.dataSource.sort = [`${field},${dir}`];\n else (draft.dataSource as any).sort = undefined as any;\n });\n this.markDirty();\n this.verify();\n }\n\n applyTemplate(): void {\n const t: any = { ...(this.working.templating as any) };\n const build = (slot: any): TemplateDef | undefined => {\n if (!slot?.field) return undefined;\n const base = '${item.' + slot.field + '}';\n if (slot.type === 'text') return { type: 'text', expr: base, class: slot.class, style: slot.style } as any;\n if (slot.type === 'chip') return { type: 'chip', expr: base, class: slot.class, style: slot.style, color: slot.chipColor, variant: slot.chipVariant } as any;\n if (slot.type === 'rating') return { type: 'rating', expr: base, class: slot.class, style: slot.style } as any;\n if (slot.type === 'currency') {\n const code = slot.currencyCode?.trim();\n const loc = slot.locale?.trim();\n const param = code ? (loc ? code + ':' + loc : code) : '';\n return { type: 'currency', expr: param ? base + '|' + param : base, class: slot.class, style: slot.style } as any;\n }\n if (slot.type === 'date') {\n const loc = slot.locale?.trim();\n const style = slot.dateStyle?.trim();\n let param = '';\n if (loc && style) param = loc + ':' + style;\n else if (loc) param = loc;\n else if (style) param = ':' + style;\n return { type: 'date', expr: param ? base + '|' + param : base, class: slot.class, style: slot.style } as any;\n }\n return undefined;\n };\n\n const p = build(this.mappingPrimary);\n const s = build(this.mappingSecondary);\n const m = build(this.mappingMeta);\n const tr = this.mappingTrailing.field ? build(this.mappingTrailing) : undefined;\n\n if (p) t.primary = p;\n if (s) {\n t.secondary = s;\n // Garantir que a UI tenha espaço para exibir o secondary\n const currentLines = Number(this.working.layout.lines as any) || 1;\n if (currentLines < 2) this.working.layout.lines = 2 as any;\n }\n if ((this.mappingMeta?.type || 'text') === 'text' && this.mappingMetaFields && this.mappingMetaFields.length) {\n const parts = this.mappingMetaFields.map((f, idx) => {\n const token = '${item.' + f + '}';\n if (idx === 1 && this.mappingMetaWrapSecondInParens) return '(' + token + ')';\n return token;\n });\n const sep = this.mappingMetaSeparator ?? ' ';\n t.meta = { type: 'text', expr: parts.join(sep), class: this.mappingMeta.class, style: this.mappingMeta.style } as any;\n } else if (m) {\n t.meta = m;\n }\n if (tr) t.trailing = tr;\n if (this.mappingLeading?.type === 'icon' && this.mappingLeading.icon && this.mappingLeading.icon.trim()) {\n t.leading = { type: 'icon', expr: this.mappingLeading.icon.trim() } as TemplateDef;\n }\n if (this.mappingLeading?.type === 'image' && this.mappingLeading.imageUrl && this.mappingLeading.imageUrl.trim()) {\n t.leading = {\n type: 'image',\n expr: this.mappingLeading.imageUrl.trim(),\n badge: this.mappingLeading.badgeText ? {\n expr: this.mappingLeading.badgeText,\n color: this.mappingLeading.badgeColor as any,\n variant: (this.mappingLeading.badgeVariant as any) || 'filled',\n } : undefined,\n } as any;\n }\n\n if (this.mappingMeta?.placement) {\n (t as any).metaPlacement = this.mappingMeta.placement;\n }\n (t as any).metaPrefixIcon = (this.mappingMetaPrefixIcon || '').trim() || undefined;\n // Apply features\n if (this.features && this.features.length) {\n t.features = this.features\n .filter(f => (f.expr || '').trim().length > 0)\n .map(f => ({ icon: f.icon, expr: f.expr, class: f.class, style: f.style }));\n } else {\n t.features = undefined as any;\n }\n (t as any).featuresVisible = this.featuresVisible;\n (t as any).featuresMode = this.featuresMode;\n\n this.working = produce(this.working, (draft) => {\n (draft as any).templating = t;\n });\n this.markDirty();\n this.verify();\n this.mappingDirty = false;\n }\n\n private ensureMappingApplied(): void {\n if (this.mappingDirty) {\n this.applyTemplate();\n }\n }\n\n onMappingChanged(): void {\n this.mappingDirty = true;\n this.isDirty$.next(true);\n if (this.featuresSyncWithMeta) {\n this.generateFeaturesFromMetaComposition();\n }\n this.verify();\n }\n\n addFeature(): void {\n this.features = [...(this.features || []), { icon: '', expr: '' }];\n this.onFeaturesChanged();\n }\n removeFeature(idx: number): void {\n const arr = [...(this.features || [])];\n arr.splice(idx, 1);\n this.features = arr;\n this.onFeaturesChanged();\n }\n onFeaturesChanged(): void {\n this.mappingDirty = true;\n this.isDirty$.next(true);\n }\n\n // ===============\n // Expr helpers (Features): click-to-insert fields and literals\n // ===============\n insertFeatureToken(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, field: string): void {\n const token = '${item.' + field + '}';\n this.insertIntoFeatureExpr(index, inputEl, token);\n }\n insertLiteralAt(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, text: string): void {\n this.insertIntoFeatureExpr(index, inputEl, text);\n }\n wrapSelectionAt(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, left: string, right: string): void {\n const start = inputEl.selectionStart ?? inputEl.value.length;\n const end = inputEl.selectionEnd ?? start;\n const value = this.features[index]?.expr || '';\n const before = value.slice(0, start);\n const sel = value.slice(start, end);\n const after = value.slice(end);\n const newExpr = before + left + sel + right + after;\n this.updateFeatureExpr(index, inputEl, newExpr, start + left.length + sel.length + right.length);\n }\n private insertIntoFeatureExpr(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, text: string): void {\n const start = inputEl.selectionStart ?? inputEl.value.length;\n const end = inputEl.selectionEnd ?? start;\n const value = this.features[index]?.expr || '';\n const newExpr = value.slice(0, start) + text + value.slice(end);\n const newCaret = start + text.length;\n this.updateFeatureExpr(index, inputEl, newExpr, newCaret);\n }\n private updateFeatureExpr(index: number, inputEl: HTMLInputElement | HTMLTextAreaElement, newExpr: string, caretPos: number): void {\n const arr = [...(this.features || [])];\n const old = arr[index] || { icon: '', expr: '' };\n arr[index] = { ...old, expr: newExpr };\n this.features = arr;\n this.onFeaturesChanged();\n // restore caret\n setTimeout(() => {\n try {\n inputEl.focus();\n inputEl.selectionStart = caretPos;\n inputEl.selectionEnd = caretPos;\n } catch {}\n });\n }\n // no-op helper intentionally removed (index is provided explicitly by the template)\n\n private hydrateMappingFromTemplating(templ?: any): void {\n if (!templ) return;\n const parseExpr = (expr?: string): { field?: string; param?: string } => {\n if (!expr) return {};\n const [base, param] = expr.split('|').map((s) => s.trim());\n const m = base.match(/\\$\\{\\s*item\\.([^}]+)\\s*}/);\n return { field: m?.[1], param };\n };\n const parseCurrency = (param?: string): { currencyCode?: string; locale?: string } => {\n if (!param) return {};\n const [code, loc] = param.split(':').map((s) => s?.trim()).filter(Boolean) as string[];\n return { currencyCode: code, locale: loc };\n };\n const parseDate = (param?: string): { locale?: string; dateStyle?: any } => {\n if (!param) return {} as any;\n const [p1, p2] = param.split(':').map((s) => s?.trim());\n if (p1 && p2) return { locale: p1, dateStyle: p2 as any };\n if (p1 && !p2 && /^(short|medium|long|full)$/i.test(p1)) return { dateStyle: p1 as any };\n return { locale: p1 } as any;\n };\n\n if (templ.primary) {\n const { field, param } = parseExpr(templ.primary.expr);\n const base: any = { field, type: templ.primary.type || 'text', class: templ.primary.class, style: templ.primary.style };\n if (templ.primary.type === 'currency') Object.assign(base, parseCurrency(param));\n if (templ.primary.type === 'date') Object.assign(base, parseDate(param));\n this.mappingPrimary = base;\n }\n if (templ.secondary) {\n const { field, param } = parseExpr(templ.secondary.expr);\n const base: any = { field, type: templ.secondary.type || 'text', class: templ.secondary.class, style: templ.secondary.style };\n if (templ.secondary.type === 'currency') Object.assign(base, parseCurrency(param));\n if (templ.secondary.type === 'date') Object.assign(base, parseDate(param));\n this.mappingSecondary = base;\n }\n if (templ.meta) {\n const { field, param } = parseExpr(templ.meta.expr);\n const base: any = { field, type: templ.meta.type || 'text', class: templ.meta.class, style: templ.meta.style };\n if (templ.meta.type === 'currency') Object.assign(base, parseCurrency(param));\n if (templ.meta.type === 'date') Object.assign(base, parseDate(param));\n this.mappingMeta = base;\n if (templ.metaPlacement) this.mappingMeta.placement = templ.metaPlacement;\n if ((templ as any).metaPrefixIcon) this.mappingMetaPrefixIcon = (templ as any).metaPrefixIcon;\n if (templ.meta?.color) this.mappingMeta.chipColor = templ.meta.color;\n if (templ.meta?.variant) this.mappingMeta.chipVariant = templ.meta.variant;\n // Try to detect composed text: split by common separators if it contains ${item.\n if (typeof templ.meta?.expr === 'string' && /\\$\\{\\s*item\\./.test(templ.meta.expr)) {\n const guessSep = / • /.test(templ.meta.expr) ? ' • ' : (/,\\s*/.test(templ.meta.expr) ? ', ' : ' ');\n const matches = Array.from(templ.meta.expr.matchAll(/\\$\\{\\s*item\\.([^}]+)\\s*}/g)).map((m: any) => m[1] as string);\n if (matches.length >= 2) {\n this.mappingMetaFields = matches as any;\n this.mappingMetaSeparator = guessSep as any;\n this.mappingMetaWrapSecondInParens = /\\(\\s*\\$\\{\\s*item\\.[^}]+\\}\\s*\\)/.test(templ.meta.expr);\n }\n }\n }\n if (templ.trailing) {\n const { field, param } = parseExpr(templ.trailing.expr);\n const base: any = { field, type: templ.trailing.type || 'text', class: templ.trailing.class, style: templ.trailing.style };\n if (templ.trailing.type === 'currency') Object.assign(base, parseCurrency(param));\n if (templ.trailing.type === 'date') Object.assign(base, parseDate(param));\n this.mappingTrailing = base;\n if (templ.trailing?.color) this.mappingTrailing.chipColor = templ.trailing.color;\n if (templ.trailing?.variant) this.mappingTrailing.chipVariant = templ.trailing.variant;\n }\n if (templ.leading?.type === 'icon' && typeof templ.leading.expr === 'string') {\n this.mappingLeading = { type: 'icon', icon: templ.leading.expr } as any;\n } else if (templ.leading?.type === 'image' && typeof templ.leading.expr === 'string') {\n this.mappingLeading = {\n type: 'image',\n imageUrl: templ.leading.expr,\n badgeText: templ.leading?.badge?.expr,\n badgeColor: templ.leading?.badge?.color,\n badgeVariant: templ.leading?.badge?.variant,\n } as any;\n }\n\n if (Array.isArray(templ.features)) {\n this.features = templ.features.map((f: any) => ({ icon: f.icon, expr: f.expr, class: f.class, style: f.style }));\n }\n this.featuresVisible = templ.featuresVisible !== false;\n this.featuresMode = (templ.featuresMode as any) || 'icons+labels';\n }\n\n markDirty(): void {\n const current = JSON.stringify(this.working);\n this.lastJson = current;\n this.isDirty$.next(current !== this.initialJson);\n }\n verify(): void {\n // Basic constraints\n const rp = (this.working?.dataSource?.resourcePath || '').trim();\n const pageSizeRaw = (this.working?.layout?.pageSize as any);\n const pageSizeNum = pageSizeRaw == null ? undefined : Number(pageSizeRaw);\n const lines = this.working?.layout?.lines as any;\n const sortField = (this.sortField || '').trim();\n\n let valid = true;\n if (!rp) valid = false;\n if (pageSizeNum != null && (!Number.isFinite(pageSizeNum) || pageSizeNum < 1)) valid = false;\n if (![1, 2, 3].includes(Number(lines))) valid = false;\n if (sortField && this.fields.length && !this.fields.includes(sortField)) valid = false;\n\n // selection.compareBy should exist when fields are loaded\n const compareBy = (this.working?.selection?.compareBy || '').trim();\n if (compareBy && this.fields.length && !this.fields.includes(compareBy)) valid = false;\n\n this.isValid$.next(valid);\n }\n\n inferFromFields(): void {\n if (!this.fields?.length) return;\n const updated = inferTemplatingFromSchema(this.working as any, this.fields);\n this.working = updated as any;\n // Keep mapping controls in sync with new templating\n this.hydrateMappingFromTemplating((this.working as any).templating);\n this.markDirty();\n this.verify();\n }\n\n // Generate Features from Meta composition\n generateFeaturesFromMetaComposition(): void {\n const fields = (this.mappingMetaFields || []).filter(Boolean);\n if (!fields.length) return;\n const created = fields.map((f) => ({ icon: this.suggestIcon(f), expr: '${item.' + f + '}' }));\n const existing = [...(this.features || [])];\n for (const nf of created) {\n const idx = existing.findIndex((x) => (x.expr || '').trim() === nf.expr);\n if (idx >= 0) {\n // update icon if missing\n if (!existing[idx].icon && nf.icon) existing[idx].icon = nf.icon;\n } else {\n existing.push(nf);\n }\n }\n this.features = existing;\n this.featuresVisible = true;\n this.featuresMode = this.featuresMode || 'icons+labels';\n this.onFeaturesChanged();\n }\n metaComposePreview(): string {\n if (!this.mappingMetaFields?.length) return '';\n const parts = this.mappingMetaFields.map((f, idx) => {\n const token = '${item.' + f + '}';\n if (idx === 1 && this.mappingMetaWrapSecondInParens) return '(' + token + ')';\n return token;\n });\n const sep = this.mappingMetaSeparator ?? ' ';\n return parts.join(sep);\n }\n private suggestIcon(field: string): string {\n const f = (field || '').toLowerCase();\n if (/(price|amount|value|total|cost|salary)/.test(f)) return 'attach_money';\n if (/(date|time|day|hour)/.test(f)) return 'schedule';\n if (/(star|rating|score)/.test(f)) return 'star';\n if (/city/.test(f)) return 'location_city';\n if (/(country|nation|world)/.test(f)) return 'public';\n if (/(location|address)/.test(f)) return 'location_on';\n if (/status/.test(f)) return 'info';\n if (/(tag|label)/.test(f)) return 'label';\n if (/email/.test(f)) return 'mail';\n if (/(phone|mobile|cell)/.test(f)) return 'call';\n return '';\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatListModule, MatSelectionListChange } from '@angular/material/list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PraxisIconDirective } from '@praxisui/core';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatSelectModule } from '@angular/material/select';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport {\n PraxisListConfig,\n ListItemEvent,\n ListActionEvent,\n ListSelectionEvent,\n} from '../models/list-config.model';\nimport { evaluateTemplate } from '../utils/template-evaluator';\nimport { adaptSelection } from '../utils/selection-adapter';\nimport { ListDataService } from '../services/list-data.service';\nimport type { ListSection } from '../services/list-data.service';\nimport { ListSkinService } from '../services/list-skin.service';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport { CONFIG_STORAGE, ConfigStorage, GenericCrudService } from '@praxisui/core';\nimport { PraxisListConfigEditor } from '../editors/list-config-editor.component';\nimport { inferTemplatingFromSchema } from '../utils/templating-inference';\n\n@Component({\n selector: 'praxis-list',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatListModule,\n MatDividerModule,\n MatIconModule,\n PraxisIconDirective,\n MatChipsModule,\n MatButtonModule,\n MatFormFieldModule,\n MatSelectModule,\n ],\n templateUrl: './praxis-list.component.html',\n styleUrls: ['./praxis-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [GenericCrudService, ListDataService],\n})\nexport class PraxisList implements OnInit, OnChanges {\n @Input() config!: PraxisListConfig;\n @Input() form?: FormGroup | null;\n\n @Output() itemClick = new EventEmitter<ListItemEvent>();\n @Output() actionClick = new EventEmitter<ListActionEvent>();\n @Output() selectionChange = new EventEmitter<ListSelectionEvent>();\n\n items$!: import('rxjs').Observable<any[]>;\n sections$!: import('rxjs').Observable<ListSection<any>[]>;\n loading$!: import('rxjs').Observable<boolean>;\n total$!: import('rxjs').Observable<number>;\n get layoutLines(): number {\n return this.config?.layout?.lines ?? 2;\n }\n\n boundControl: FormControl<unknown | unknown[] | null> = new FormControl<\n unknown | unknown[] | null\n >(null);\n skinClasses = '';\n inlineCss = '';\n\n private readonly storage = inject(CONFIG_STORAGE);\n private readonly skin = inject(ListSkinService);\n private inferredForPath = new Set<string>();\n\n private readonly data = inject<ListDataService<any>>(ListDataService as any);\n private readonly settings = inject(SettingsPanelService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n ngOnInit(): void {\n this.applyPersistence();\n // Try infer templating upfront when using remote resource\n this.tryInferTemplatingFromSchema(this.config);\n this.data.setConfig(this.config);\n this.items$ = this.data.stream();\n this.sections$ = this.data.groupedStream();\n this.loading$ = this.data.loading$;\n this.total$ = this.data.total$;\n this.setupSelectionBinding();\n this.applySkins();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['config']) {\n // Avoid double initialization: the first change for @Input happens before ngOnInit.\n // We already perform the initial setup in ngOnInit, so skip the first change here.\n if (changes['config'].firstChange) return;\n this.applyPersistence();\n this.tryInferTemplatingFromSchema(this.config);\n this.data.setConfig(this.config);\n this.items$ = this.data.stream();\n this.sections$ = this.data.groupedStream();\n this.loading$ = this.data.loading$;\n this.total$ = this.data.total$;\n this.setupSelectionBinding();\n this.applySkins();\n }\n }\n\n private applyPersistence(): void {\n const id = this.config?.id;\n if (!id) return;\n const saved = this.storage.loadConfig<PraxisListConfig>(\n `praxis-list-config-${id}`,\n );\n if (saved) {\n this.config = { ...saved, id };\n }\n }\n\n private applySkins(): void {\n this.skinClasses = this.skin.toHostClasses(this.config).join(' ');\n this.inlineCss = this.skin.toInlineStyle(this.config);\n }\n\n isListVariant(): boolean {\n return (this.config?.layout?.variant || 'list') === 'list';\n }\n\n isSelectionEnabled(): boolean {\n return (this.config?.selection?.mode || 'none') !== 'none';\n }\n\n private setupSelectionBinding(): void {\n if (!this.isSelectionEnabled()) {\n // Keep a local control to satisfy template typing; it won't be used when selection is disabled\n this.boundControl.setValue(null);\n return;\n }\n const mode = this.config?.selection?.mode || 'none';\n const path = this.config?.selection?.formControlPath;\n const name = this.config?.selection?.formControlName;\n if (this.form && (name || path)) {\n const ctrl = name ? this.form.get(name) : path ? this.form.get(path!) : null;\n if (ctrl instanceof FormControl) {\n this.boundControl = ctrl as FormControl<any>;\n return;\n }\n }\n // Fallback to local control\n this.boundControl = new FormControl<unknown | unknown[] | null>(\n mode === 'multiple' ? ([] as unknown[]) : null,\n );\n }\n\n leading = (item: any) => this.evalSlot('leading', item);\n primary = (item: any) => this.evalSlot('primary', item);\n secondary = (item: any) => this.evalSlot('secondary', item);\n meta = (item: any) => this.evalSlot('meta', item);\n trailing = (item: any) => this.evalSlot('trailing', item);\n sectionHeader = (key: string) =>\n evaluateTemplate(this.config?.templating?.sectionHeader, { key })?.value || key;\n featureLabel(item: any, expr: string): string {\n return this.evalString(expr || '', { item });\n }\n featuresVisible(): boolean {\n const t = this.config?.templating;\n const has = (t?.features?.length || 0) > 0;\n const visible = t?.featuresVisible !== false;\n return has && visible;\n }\n featuresMode(): 'icons+labels'|'icons-only'|'labels-only' {\n return (this.config?.templating as any)?.featuresMode || 'icons+labels';\n }\n\n hasSkeleton(): boolean {\n return !!this.config?.templating?.skeleton && this.skeletonCount() > 0;\n }\n skeletonCount(): number {\n return this.config?.templating?.skeleton?.count ?? 3;\n }\n skeletonItems(): any[] {\n return Array.from({ length: this.skeletonCount() });\n }\n\n visibleActions(item: any) {\n const actions = this.config?.actions || [];\n return actions.filter((a) => {\n if (!a.showIf) return true;\n // Support simple equality checks like ${item.status} == 'done'\n const left = a.showIf.split('==')[0]?.trim();\n const right = a.showIf.split('==')[1]?.trim()?.replace(/^['\"]|['\"]$/g, '');\n if (left && right != null) {\n const val = left\n .replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n try {\n return String(\n path\n .split('.')\n .reduce((acc: any, k: string) => acc?.[k], { item }),\n );\n } catch {\n return '';\n }\n })\n .trim();\n return val === right;\n }\n return true;\n });\n }\n\n onItemClick(item: any, index: number, section?: string): void {\n this.itemClick.emit({ item, index, section });\n }\n\n onActionClick(ev: MouseEvent, actionId: string, item: any, index: number): void {\n ev.stopPropagation();\n this.actionClick.emit({ actionId, item, index });\n }\n\n onSelectionChange(_change: MatSelectionListChange): void {\n if (!this.boundControl) return;\n const val = this.boundControl.value;\n const arr = Array.isArray(val) ? val : val != null ? [val] : [];\n this.selectionChange.emit(adaptSelection(this.config, arr));\n }\n\n openConfigEditor(): void {\n const id = this.config?.id || 'default';\n const ref = this.settings.open({\n id: `praxis-list-editor:${id}`,\n title: 'Lista – Configurações',\n content: {\n component: PraxisListConfigEditor,\n inputs: { config: this.config, listId: id },\n },\n });\n\n ref.applied$.subscribe((applied) => {\n const newCfg: PraxisListConfig = applied?.config || applied;\n this.onEditorApplied(newCfg);\n });\n ref.saved$.subscribe((saved) => {\n const newCfg: PraxisListConfig = saved?.config || saved;\n this.storage.saveConfig(`praxis-list-config-${id}`, newCfg);\n this.onEditorApplied(newCfg);\n });\n }\n\n nextPage(): void {\n this.data.nextPage();\n }\n prevPage(): void {\n this.data.prevPage();\n }\n setPageSize(ps: number): void {\n const size = Number(ps);\n if (isFinite(size) && size > 0) this.data.setPageSize(size);\n }\n\n private onEditorApplied(newCfg: PraxisListConfig): void {\n this.config = newCfg;\n // Optionally infer templates from backend schema if not defined\n this.tryInferTemplatingFromSchema(newCfg);\n // Re-apply runtime wiring\n this.data.setConfig(this.config);\n this.setupSelectionBinding();\n this.applySkins();\n this.cdr.markForCheck();\n }\n\n private readonly crud = inject(GenericCrudService as any, { optional: true }) as GenericCrudService<any> | null;\n\n private tryInferTemplatingFromSchema(cfg: PraxisListConfig): void {\n const rp = cfg.dataSource?.resourcePath;\n if (!rp || !this.crud) return;\n const templ = cfg.templating || {};\n const needsPrimary = !templ.primary;\n if (!needsPrimary) return; // do not override when user already defined\n if (this.inferredForPath.has(rp)) return; // avoid repeated schema calls for the same path\n try {\n this.crud.configure(rp);\n this.crud\n .getSchema()\n .subscribe({\n next: (fields: any[]) => {\n this.inferredForPath.add(rp);\n const names = (fields || [])\n .map((f: any) => f.name || f.field || f.key)\n .filter(Boolean) as string[];\n if (!names.length) return;\n const updated = inferTemplatingFromSchema(cfg, names);\n // Assign back to current config reference\n // Only assign if primary is still not defined to avoid loops\n if (!this.config?.templating?.primary) {\n this.config = updated;\n }\n },\n error: () => {\n // ignore schema errors; keep config as-is\n this.inferredForPath.add(rp);\n },\n });\n } catch {\n // ignore\n }\n }\n\n private evalSlot(\n slot: 'leading' | 'primary' | 'secondary' | 'meta' | 'trailing',\n item: any,\n ) {\n const def = this.config?.templating?.[slot];\n if (!def) return null;\n if (def.type === 'currency') {\n const { baseExpr, param } = this.splitPipe(def.expr);\n const [codeFromExpr, localeFromExpr] = this.parseTwoParams(param);\n const currencyCode = codeFromExpr || (this.config?.i18n as any)?.currency || 'USD';\n const locale = localeFromExpr || (this.config?.i18n as any)?.locale || undefined;\n const rawStr = this.evalString(baseExpr, { item });\n const raw = Number(rawStr?.replace?.(/[^0-9.,-]/g, '').replace(',', '.') ?? rawStr);\n const fmt = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n }).format(raw ?? 0);\n return { type: def.type, value: fmt, class: def.class, style: def.style };\n }\n if (def.type === 'date') {\n const { baseExpr, param } = this.splitPipe(def.expr);\n const [localeFromExpr, styleFromExpr] = this.parseTwoParams(param);\n const locale = localeFromExpr || (this.config?.i18n as any)?.locale || undefined;\n const dateStyle = this.mapDateStyle(styleFromExpr);\n const raw = this.evalString(baseExpr, { item });\n const dt = raw ? new Date(raw) : null;\n const fmt = dt ? new Intl.DateTimeFormat(locale, dateStyle).format(dt) : '';\n return { type: def.type, value: fmt, class: def.class, style: def.style };\n }\n if (def.type === 'rating') {\n const { baseExpr } = this.splitPipe(def.expr);\n const raw = Number(this.evalString(baseExpr, { item }));\n return {\n type: def.type,\n value: isFinite(raw) ? String(raw) : '0',\n class: def.class,\n style: def.style,\n };\n }\n if (def.type === 'chip') {\n const { baseExpr, param } = this.splitPipe(def.expr);\n let value = this.evalString(baseExpr, { item });\n if (param) {\n const [pipeName, rest] = this.splitPipeName(param);\n if (pipeName === 'bool') {\n const [t, f] = this.parseTwoParams(rest);\n const truthy = this.toBoolean(value);\n value = truthy ? (t ?? 'Sim') : (f ?? 'Não');\n }\n }\n // Optional color mapping from config.templating.chipColorMap\n let color = (def as any).color as string | undefined;\n try {\n const map = (this.config?.templating as any)?.chipColorMap as Record<string, string> | undefined;\n if (map && typeof value === 'string') {\n const key = String(value).toLowerCase();\n const found = map[key] ?? map[value];\n if (found) color = found;\n }\n } catch {}\n // Optional label mapping\n try {\n const lmap = (this.config?.templating as any)?.chipLabelMap as Record<string, string> | undefined;\n if (lmap && typeof value === 'string') {\n const key = String(value).toLowerCase();\n const lbl = lmap[key] ?? lmap[value];\n if (lbl) value = lbl;\n } else if (typeof value === 'string') {\n value = this.prettyLabel(value);\n }\n } catch {}\n return { type: def.type, value, class: def.class, style: def.style, color, variant: (def as any).variant } as any;\n }\n if (def.type === 'icon') {\n const out = evaluateTemplate(def, item) as any;\n // Optional color mapping from config.templating.iconColorMap\n try {\n const map = (this.config?.templating as any)?.iconColorMap as Record<string, string> | undefined;\n if (map) {\n const status = String(item?.status ?? '').trim();\n const icon = String(out?.value ?? '').trim();\n const tryKeys = [\n status,\n status.toLowerCase?.(),\n icon,\n icon.toLowerCase?.(),\n ].filter(Boolean) as string[];\n for (const k of tryKeys) {\n const found = (map as any)[k];\n if (found) { out.color = found; break; }\n }\n }\n } catch {}\n return out;\n }\n return evaluateTemplate(def, item);\n }\n\n private splitPipe(expr: string): { baseExpr: string; param?: string } {\n const idx = expr.indexOf('|');\n if (idx === -1) return { baseExpr: expr.trim() };\n return { baseExpr: expr.slice(0, idx).trim(), param: expr.slice(idx + 1).trim() };\n }\n\n private splitPipeName(spec: string): [string, string | undefined] {\n const idx = spec.indexOf(':');\n if (idx === -1) return [spec.trim(), undefined];\n return [spec.slice(0, idx).trim(), spec.slice(idx + 1).trim()];\n }\n\n private evalString(expr: string, ctx: any): string {\n return expr.replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n try {\n const value = path\n .split('.')\n .reduce((acc: any, k: string) => (acc == null ? undefined : acc[k]), ctx);\n return value == null ? '' : String(value);\n } catch {\n return '';\n }\n });\n }\n\n private parseTwoParams(param?: string): [string | undefined, string | undefined] {\n if (!param) return [undefined, undefined];\n // Accept forms: \"A\", \"A:B\", \":B\" (only second)\n const parts = param.split(':');\n const first = parts[0]?.trim();\n const second = parts[1]?.trim();\n if (first === '') return [undefined, second || undefined];\n if (parts.length === 1) return [first || undefined, undefined];\n return [first || undefined, second || undefined];\n }\n\n private toBoolean(val: any): boolean {\n if (typeof val === 'boolean') return val;\n const s = String(val).trim().toLowerCase();\n return s === 'true' || s === '1' || s === 'yes' || s === 'sim' || s === 'on';\n }\n\n // Format labels like 'EM_ANDAMENTO' -> 'Em andamento'; 'PLANEJADA' -> 'Planejada'\n private prettyLabel(v: string): string {\n try {\n const t = String(v ?? '')\n .replace(/[\\s_\\-]+/g, ' ')\n .trim()\n .toLowerCase();\n if (!t) return '';\n return t.replace(/\\b\\w/g, (m) => m.toUpperCase());\n } catch { return String(v ?? ''); }\n }\n\n private mapDateStyle(style?: string): Intl.DateTimeFormatOptions {\n switch ((style || '').toLowerCase()) {\n case 'short':\n return { dateStyle: 'short' };\n case 'long':\n return { dateStyle: 'long' };\n case 'full':\n return { dateStyle: 'full' };\n case 'medium':\n default:\n return { dateStyle: 'medium' };\n }\n }\n\n starIcon(index: number, ratingValue: string | number): string {\n const r = typeof ratingValue === 'number' ? ratingValue : parseFloat(ratingValue || '0');\n const pos = index + 1; // 1..5\n if (r >= pos) return 'star';\n if (r >= pos - 0.5) return 'star_half';\n return 'star_border';\n }\n\n // trackBy helpers for ngFor\n trackBySection = (_: number, s: ListSection<any>) => s?.key ?? _;\n trackByItem = (i: number, it: any) =>\n this.config?.selection?.compareBy ? (it?.[this.config.selection.compareBy] ?? i) : (it?.id ?? i);\n}\n","<div\n class=\"praxis-list-root\"\n [ngClass]=\"skinClasses\"\n [attr.aria-label]=\"config.a11y?.ariaLabel || null\"\n [attr.aria-labelledby]=\"config.a11y?.ariaLabelledBy || null\"\n>\n @if (inlineCss) {\n <style [innerHTML]=\"inlineCss\"></style>\n }\n\n <!-- Skeleton while loading -->\n @if ((loading$ | async) && hasSkeleton()) {\n @if (isListVariant()) {\n <mat-list>\n @for (_ of skeletonItems(); track $index; let i = $index) {\n <mat-list-item>\n <div class=\"list-item-content\">\n <div class=\"skeleton skeleton-avatar\"></div>\n <div style=\"width:100%\">\n <div class=\"skeleton skeleton-line w-60\"></div>\n @if (layoutLines > 1) { <div class=\"skeleton skeleton-line w-40\"></div> }\n </div>\n <div class=\"skeleton skeleton-chip\"></div>\n </div>\n </mat-list-item>\n }\n </mat-list>\n } @else {\n <div class=\"cards-grid\">\n @for (_ of skeletonItems(); track $index; let i = $index) {\n <div class=\"item-card\">\n <div class=\"list-item-content\">\n <div class=\"skeleton skeleton-avatar\"></div>\n <div style=\"width:100%\">\n <div class=\"skeleton skeleton-line w-60\"></div>\n @if (layoutLines > 1) { <div class=\"skeleton skeleton-line w-40\"></div> }\n </div>\n <div class=\"skeleton skeleton-chip\"></div>\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"notLoading\"></ng-container>\n }\n\n <ng-template #notLoading>\n <!-- Empty state -->\n @if (items$ | async; as all) {\n @if (all.length === 0) {\n <div class=\"section-header\">\n {{ (config.templating?.emptyState?.expr || 'Nenhum item disponível') }}\n </div>\n }\n }\n\n <!-- List variant -->\n @if (isListVariant()) {\n <!-- Selection list -->\n @if (isSelectionEnabled()) {\n <mat-selection-list\n [multiple]=\"config.selection?.mode === 'multiple'\"\n [formControl]=\"boundControl\"\n (selectionChange)=\"onSelectionChange($event)\"\n >\n @for (section of sections$ | async; track trackBySection($index, section)) {\n @if (section.key) {\n <div class=\"section-header mat-subheader\">\n {{ sectionHeader(section.key) }}\n </div>\n }\n @for (item of section.items; track trackByItem($index, item); let i = $index) {\n <mat-list-option\n [value]=\"item\"\n (click)=\"onItemClick(item, i, section.key || undefined)\"\n >\n <div class=\"list-item-content\">\n @if (leading(item); as lead) {\n @switch (lead.type) {\n @case ('icon') {\n <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon>\n }\n @case ('image') {\n <div class=\"lead-image\" [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">\n <img [src]=\"lead.value\" [alt]=\"config.templating?.leading?.imageAlt || ''\" />\n @if (lead.badge?.value) {\n <mat-chip class=\"lead-badge\" [color]=\"lead.badge?.color || undefined\" [ngClass]=\"(((lead.badge?.variant || 'filled') === 'outlined') ? 'chip-outlined' : '')\">{{ lead.badge?.value }}</mat-chip>\n }\n </div>\n }\n }\n }\n @if (meta(item); as m) {\n <div>\n <div class=\"primary\" [ngClass]=\"primary(item)?.class\" [style.cssText]=\"primary(item)?.style\">{{ primary(item)?.value }}</div>\n @if (layoutLines > 1) { <div class=\"secondary\" [ngClass]=\"secondary(item)?.class\" [style.cssText]=\"secondary(item)?.style\">{{ secondary(item)?.value }}</div> }\n @if ((config.templating?.metaPlacement === 'line' && (m?.type === 'text' || m?.type === 'date')) || (layoutLines > 2 && (m?.type === 'text' || m?.type === 'date'))) {\n <div class=\"tertiary\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @if (config.templating?.metaPrefixIcon; as mpi) { <mat-icon [praxisIcon]=\"mpi\"></mat-icon> }\n {{ m.value }}\n </div>\n }\n @if (featuresVisible()) {\n @for (f of (config.templating?.features || []); track $index; let fi = $index) {\n <span class=\"feature\">\n @if (f.icon && featuresMode() !== 'labels-only') { <mat-icon [praxisIcon]=\"f.icon\"></mat-icon> }\n @if (featuresMode() !== 'icons-only') { <span [ngClass]=\"f.class\" [style.cssText]=\"f.style\">{{ featureLabel(item, f.expr) }}</span> }\n </span>\n }\n }\n </div>\n @if (!(((config.templating?.metaPlacement === 'line') || (layoutLines > 2)) && (m?.type === 'text' || m?.type === 'date'))) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip [color]=\"m.color || undefined\" [ngClass]=\"((m.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon [praxisIcon]=\"starIcon(idx, m.value)\"></mat-icon> } }\n @default { <span>@if (config.templating?.metaPrefixIcon; as mpi2) { <mat-icon>{{ mpi2 }}</mat-icon> }{{ m.value }}</span> }\n }\n </div>\n }\n @if (trailing(item); as tr) {\n <div class=\"trailing\" [ngClass]=\"tr.class\" [style.cssText]=\"tr.style\">\n @switch (tr.type) {\n @case ('chip') { <mat-chip [color]=\"tr.color || undefined\" [ngClass]=\"((tr.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ tr.value }}</mat-chip> }\n @case ('icon') { <mat-icon [praxisIcon]=\"tr.value\" [color]=\"tr.color || undefined\"></mat-icon> }\n @default { <span>{{ tr.value }}</span> }\n }\n </div>\n }\n }\n @for (action of visibleActions(item); let aidx = $index; track action?.id ?? $index) {\n @if ((action.kind || 'icon') === 'icon') {\n <button mat-icon-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">\n <mat-icon [praxisIcon]=\"action.icon\"></mat-icon>\n </button>\n } @else {\n @if (action.buttonVariant === 'stroked') { <button mat-stroked-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n @if (action.buttonVariant === 'raised') { <button mat-raised-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n @if (!action.buttonVariant || action.buttonVariant === 'flat') { <button mat-flat-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n }\n }\n </div>\n </mat-list-option>\n }\n }\n </mat-selection-list>\n } @else {\n <ng-container *ngTemplateOutlet=\"readList\"></ng-container>\n }\n\n <!-- Read-only list -->\n <ng-template #readList>\n <mat-list>\n @for (section of sections$ | async; track trackBySection($index, section); let sidx = $index) {\n @if (section.key) {\n <div class=\"section-header mat-subheader\">\n {{ sectionHeader(section.key) }}\n </div>\n }\n @for (item of section.items; track trackByItem($index, item); let i = $index) {\n <mat-list-item (click)=\"onItemClick(item, i, section.key || undefined)\">\n <div class=\"list-item-content\">\n @if (leading(item); as lead) { <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon> }\n @if (meta(item); as m) {\n <div>\n <div class=\"primary\" [ngClass]=\"primary(item)?.class\" [style.cssText]=\"primary(item)?.style\">{{ primary(item)?.value }}</div>\n @if (layoutLines > 1) { <div class=\"secondary\" [ngClass]=\"secondary(item)?.class\" [style.cssText]=\"secondary(item)?.style\">{{ secondary(item)?.value }}</div> }\n @if ((config.templating?.metaPlacement === 'line' && (m?.type === 'text' || m?.type === 'date')) || (layoutLines > 2 && (m?.type === 'text' || m?.type === 'date'))) { <div class=\"tertiary\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">{{ m.value }}</div> }\n </div>\n @if (!(((config.templating?.metaPlacement === 'line') || (layoutLines > 2)) && (m?.type === 'text' || m?.type === 'date'))) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip>{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon>{{ starIcon(idx, m.value) }}</mat-icon> } }\n @default { <span>{{ m.value }}</span> }\n }\n </div>\n }\n @if (trailing(item); as tr) {\n <div class=\"trailing\" [ngClass]=\"tr.class\" [style.cssText]=\"tr.style\">\n @switch (tr.type) {\n @case ('chip') { <mat-chip>{{ tr.value }}</mat-chip> }\n @case ('icon') { <mat-icon [praxisIcon]=\"tr.value\" [color]=\"tr.color || undefined\"></mat-icon> }\n @default { <span>{{ tr.value }}</span> }\n }\n </div>\n }\n }\n @for (action of visibleActions(item); let aidx = $index; track action?.id ?? $index) {\n <button mat-icon-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, item, i)\" [attr.aria-label]=\"action.label || action.id\">\n <mat-icon>{{ action.icon }}</mat-icon>\n </button>\n }\n </div>\n </mat-list-item>\n }\n @if (config.layout?.dividers === 'between') { <mat-divider></mat-divider> }\n }\n </mat-list>\n </ng-template>\n } @else {\n <ng-container *ngTemplateOutlet=\"cardsVariant\"></ng-container>\n }\n\n <!-- Cards variant -->\n <ng-template #cardsVariant>\n <div class=\"cards-grid\">\n @for (it of (items$ | async) ?? []; track $index; let i = $index) {\n <div class=\"item-card\" (click)=\"onItemClick(it, i)\">\n <div class=\"list-item-content\">\n @if (leading(it); as lead) {\n @switch (lead.type) {\n @case ('icon') { <mat-icon [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">{{ lead.value }}</mat-icon> }\n @case ('image') {\n <div class=\"lead-image\" [ngClass]=\"lead.class\" [style.cssText]=\"lead.style\">\n <img [src]=\"lead.value\" [alt]=\"config.templating?.leading?.imageAlt || ''\" />\n @if (lead.badge?.value) { <mat-chip class=\"lead-badge\" [color]=\"lead.badge?.color || undefined\" [ngClass]=\"(((lead.badge?.variant || 'filled') === 'outlined') ? 'chip-outlined' : '')\">{{ lead.badge?.value }}</mat-chip> }\n </div>\n }\n }\n }\n @if (meta(it); as m) {\n <div>\n <div class=\"primary\" [ngClass]=\"primary(it)?.class\" [style.cssText]=\"primary(it)?.style\">{{ primary(it)?.value }}</div>\n @if (layoutLines > 1) { <div class=\"secondary\" [ngClass]=\"secondary(it)?.class\" [style.cssText]=\"secondary(it)?.style\">{{ secondary(it)?.value }}</div> }\n @if ((config.templating?.metaPlacement === 'line' && (m?.type === 'text' || m?.type === 'date')) || (layoutLines > 2 && (m?.type === 'text' || m?.type === 'date'))) { <div class=\"tertiary\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">{{ m.value }}</div> }\n @if (featuresVisible()) {\n @for (f of (config.templating?.features || []); track $index; let fi = $index) {\n <span class=\"feature\">\n @if (f.icon && featuresMode() !== 'labels-only') { <mat-icon>{{ f.icon }}</mat-icon> }\n @if (featuresMode() !== 'icons-only') { <span [ngClass]=\"f.class\" [style.cssText]=\"f.style\">{{ featureLabel(it, f.expr) }}</span> }\n </span>\n }\n }\n </div>\n @if (!(((config.templating?.metaPlacement === 'line') || (layoutLines > 2)) && (m?.type === 'text' || m?.type === 'date'))) {\n <div class=\"meta\" [ngClass]=\"m.class\" [style.cssText]=\"m.style\">\n @switch (m.type) {\n @case ('chip') { <mat-chip [color]=\"m.color || undefined\" [ngClass]=\"((m.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ m.value }}</mat-chip> }\n @case ('rating') { @for (_ of [0,1,2,3,4]; track $index; let idx = $index) { <mat-icon>{{ starIcon(idx, m.value) }}</mat-icon> } }\n @default { <span>{{ m.value }}</span> }\n }\n </div>\n }\n @if (trailing(it); as tr) {\n @if ((config.templating?.statusPosition || 'inline') === 'top-right' && (tr?.type === 'chip' || tr?.type === 'icon')) {\n <div class=\"status-overlay\">\n @if (tr?.type === 'chip') { <mat-chip [color]=\"tr.color || undefined\" [ngClass]=\"((tr.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ tr.value }}</mat-chip> }\n @if (tr?.type === 'icon') { <mat-icon [praxisIcon]=\"tr.value\" [color]=\"tr.color || undefined\"></mat-icon> }\n </div>\n } @else {\n <div class=\"trailing\" [ngClass]=\"tr.class\" [style.cssText]=\"tr.style\">\n @switch (tr.type) {\n @case ('chip') { <mat-chip [color]=\"tr.color || undefined\" [ngClass]=\"((tr.variant || 'filled') === 'outlined') ? 'chip-outlined' : ''\">{{ tr.value }}</mat-chip> }\n @case ('icon') { <mat-icon [praxisIcon]=\"tr.value\" [color]=\"tr.color || undefined\"></mat-icon> }\n @default { <span>{{ tr.value }}</span> }\n }\n </div>\n }\n }\n }\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n @for (action of visibleActions(it); let aidx = $index; track action?.id ?? $index) {\n @if ((action.kind || 'icon') === 'icon') {\n <button mat-icon-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, it, i)\" [attr.aria-label]=\"action.label || action.id\">\n <mat-icon>{{ action.icon }}</mat-icon>\n </button>\n } @else {\n @if (action.buttonVariant === 'stroked') { <button mat-stroked-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, it, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n @if (action.buttonVariant === 'raised') { <button mat-raised-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, it, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n @if (!action.buttonVariant || action.buttonVariant === 'flat') { <button mat-flat-button [color]=\"action.color || undefined\" (click)=\"onActionClick($event, action.id, it, i)\" [attr.aria-label]=\"action.label || action.id\">{{ action.label || action.id }}</button> }\n }\n }\n </div>\n </div>\n }\n </div>\n </ng-template>\n \n <!-- Simple pagination controls for remote data -->\n @if (config.dataSource?.resourcePath) {\n <div class=\"paginator\">\n <button mat-stroked-button color=\"primary\" (click)=\"prevPage()\">Anterior</button>\n <button mat-stroked-button color=\"primary\" (click)=\"nextPage()\">Próximo</button>\n <mat-form-field style=\"width: 120px; margin-left: 8px;\" appearance=\"outline\">\n <mat-label>Tam. página</mat-label>\n <mat-select (selectionChange)=\"setPageSize($event.value)\" [value]=\"config.layout?.pageSize || 10\">\n <mat-option [value]=\"6\">6</mat-option>\n <mat-option [value]=\"8\">8</mat-option>\n <mat-option [value]=\"12\">12</mat-option>\n <mat-option [value]=\"24\">24</mat-option>\n </mat-select>\n </mat-form-field>\n @if (total$ | async; as total) { <span class=\"muted\">Total: {{ total }}</span> }\n </div>\n }\n </ng-template>\n</div>\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\nimport { PraxisList } from './components/praxis-list.component';\n\nexport const PRAXIS_LIST_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-list',\n selector: 'praxis-list',\n component: PraxisList,\n friendlyName: 'Praxis List',\n description: 'Lista com suporte a seleção (single/multiple), agrupamento e templates.',\n icon: 'checklist',\n inputs: [\n { name: 'config', type: 'PraxisListConfig', description: 'Configuração da lista (fonte de dados, layout, seleção, templates, ações)' },\n { name: 'form', type: 'FormGroup', description: 'FormGroup opcional quando integrado a formulários' },\n ],\n outputs: [\n { name: 'itemClick', type: 'ListItemEvent', description: 'Clique em item' },\n { name: 'actionClick', type: 'ListActionEvent', description: 'Clique em ação de item' },\n { name: 'selectionChange', type: 'ListSelectionEvent', description: 'Mudança de seleção' },\n ],\n tags: ['widget', 'list', 'selection', 'configurable'],\n lib: '@praxisui/list',\n};\n\nexport function providePraxisListMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_LIST_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","/*\n * Public API Surface of praxis-list\n */\n\nexport * from './lib/components/praxis-list.component';\nexport * from './lib/editors/list-config-editor.component';\nexport * from './lib/models/list-config.model';\nexport * from './lib/services/list-data.service';\nexport * from './lib/utils/templating-inference';\nexport * from './lib/services/list-skin.service';\nexport * from './lib/utils/template-evaluator';\nexport * from './lib/utils/selection-adapter';\nexport * from './lib/praxis-list.metadata';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ListSkinService","i5","i3","i4","i9","i13","i6","i7","i8"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;;;AAGG;AACG,SAAU,QAAQ,CAAC,IAAY,EAAE,GAAQ,EAAA;AAC7C,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE;;IAEpB,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAW,KAAI;AACvD,QAAA,IAAI;YACF,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC;YAC9C,MAAM,KAAK,GAAG;iBACX,KAAK,CAAC,GAAG;iBACT,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAS,MAAM,GAAG,IAAI,IAAI,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AAC3E,YAAA,IAAI,GAAG,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;YAC5C,IAAI,IAAI,EAAE;gBACR,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC;AACtC,gBAAA,IAAI,IAAI,KAAK,MAAM,EAAE;oBACnB,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC;AAClD,oBAAA,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;AAC/B,oBAAA,GAAG,GAAG,MAAM,IAAI,SAAS,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC;;AAE7D,gBAAA,IAAI,IAAI,KAAK,MAAM,EAAE;oBACnB,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC;AAChD,oBAAA,MAAM,EAAE,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;oBACzC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;wBAC9B,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,IAAI,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC9F,GAAG,GAAG,GAAG;;yBACJ;wBACL,GAAG,GAAG,EAAE;;;AAGZ,gBAAA,IAAI,IAAI,KAAK,KAAK,EAAE;AAClB,oBAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;oBACtC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,GAAG;;AAE/E,gBAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;oBACrB,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC;AAChD,oBAAA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;AACzB,oBAAA,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE;wBACjB,MAAM,GAAG,GAA6B,EAAE;wBACxC,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,SAAS;AAAE,4BAAA,GAAG,CAAC,QAAQ,GAAG,SAAS;AAC1E,wBAAA,GAAG,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;;;;AAI1E,YAAA,OAAO,GAAG;;AACV,QAAA,MAAM;AACN,YAAA,OAAO,EAAE;;AAEb,KAAC,CAAC;AACJ;AAEA;;;;AAIG;AACG,SAAU,gBAAgB,CAC9B,GAA4B,EAC5B,IAAS,EAAA;AAET,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,IAAI;AACrB,IAAA,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IACnD,IAAI,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;IAExC,IAAI,IAAI,EAAE;QACR,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC;AACtC,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;YACnB,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC;AAClD,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC;AAC/B,YAAA,KAAK,GAAG,MAAM,IAAI,SAAS,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC;;;AAIjE,IAAA,MAAM,GAAG,GAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAG,GAAW,CAAC,KAAK,EAAE,OAAO,EAAG,GAAW,CAAC,OAAO,EAAE;AACxI,IAAA,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE;AACnB,QAAA,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QACjE,IAAI,QAAQ,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACrC,IAAI,EAAE,EAAE;YACN,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;AACpC,YAAA,IAAI,IAAI,KAAK,MAAM,EAAE;gBACnB,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC;AAClD,gBAAA,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC;AAClC,gBAAA,QAAQ,GAAG,MAAM,IAAI,SAAS,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC;;;QAGpE,GAAG,CAAC,KAAK,GAAG;AACV,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK;AACtB,YAAA,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;SAC3B;;AAEH,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,cAAc,CAAC,IAAY,EAAA;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;IAC7B,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE;AAChD,IAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;AAClF;AAEA,SAAS,SAAS,CAAC,QAAgB,EAAA;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;IACjC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE;AAChD,IAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;AACtF;AAEA,SAAS,YAAY,CAAC,OAAgB,EAAA;AACpC,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;IAChC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;IAC/B,OAAO,CAAC,KAAK,IAAI,SAAS,EAAE,MAAM,IAAI,SAAS,CAAC;AAClD;AAEA,SAAS,SAAS,CAAC,GAAQ,EAAA;IACzB,IAAI,OAAO,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,GAAG;AACxC,IAAA,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAC1C,IAAA,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI;AAC9E;AAEA,SAAS,YAAY,CAAC,KAAc,EAAA;IAClC,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE;AACjC,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAgC;AAC7D,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAgC;AAC5D,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAgC;AAC5D,QAAA,KAAK,QAAQ;AACb,QAAA;AACE,YAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAgC;;AAElE;AAEA,SAAS,QAAQ,CAAC,IAAa,EAAA;IAC7B,MAAM,GAAG,GAA2B,EAAE;AACtC,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,GAAG;IACrB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACvE,IAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE;AAChB,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;AAChC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;AACjC,QAAA,IAAI,CAAC;AAAE,YAAA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;;AAEnB,IAAA,OAAO,GAAG;AACZ;;ACpJM,SAAU,cAAc,CAC5B,MAAoC,EACpC,KAAY,EAAA;IAEZ,MAAM,IAAI,IAAI,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,MAAM,CAA0B;AACzE,IAAA,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,EAAE,SAAS;IAC9C,MAAM,GAAG,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,OAAO;AAChD,IAAA,MAAM,KAAK,GAAG,IAAI,KAAK,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK;IAC1D,MAAM,GAAG,GAAG,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS;IACtE,IAAI,GAAG,GAAQ,KAAK;IACpB,IAAI,GAAG,KAAK,IAAI;AAAE,QAAA,GAAG,GAAG,IAAI,KAAK,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG;SAC7D,IAAI,GAAG,KAAK,MAAM;QAAE,GAAG,GAAG,KAAK;SAC/B,IAAI,GAAG,KAAK,OAAO;AAAE,QAAA,GAAG,GAAG,IAAI,KAAK,QAAQ,GAAG,KAAK,GAAG,KAAK;IAEjE,OAAO;QACL,IAAI;AACJ,QAAA,KAAK,EAAE,GAAG;QACV,KAAK;QACL,GAAG;KACJ;AACH;;MCVa,eAAe,CAAA;AAClB,IAAA,OAAO,GAAG,IAAI,eAAe,CAA0B,IAAI,CAAC;AAC5D,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAO,SAAS,CAAC;AAC/C,IAAA,SAAS,GAAG,IAAI,eAAe,CAA4D,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC3H,IAAA,MAAM,GAAG,IAAI,eAAe,CAAsB,EAAE,CAAC;AACpD,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AAC9C,IAAA,MAAM,GAAG,IAAI,eAAe,CAAS,CAAC,CAAC;IACxC,OAAO,GAAG,EAAE;AAEH,IAAA,IAAI,GAAG,MAAM,CAAC,kBAAyB,EAAE;AACxD,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAiC;AAElC,IAAA,SAAS,CAAC,MAAwB,EAAA;AAChC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;AACzB,YAAA,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,IAAI,EAAE;AAC1C,YAAA,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;AAChD,YAAA,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE;YAClC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;AAC/E,SAAA,CAAC;AACF,QAAA,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI,CAAC,OAAO;AACpC,QAAA,IAAI,CAAC,OAAO,GAAG,GAAG;QAClB,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACzB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE;AACxC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;AAC5G,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC;;;IAIpD,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;;AAGd,IAAA,QAAQ;IAEhB,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;AAC5B,gBAAA,IAAI,CAAC,OAAO;AACZ,gBAAA,IAAI,CAAC,SAAS;AACd,gBAAA,IAAI,CAAC,MAAM;AACX,gBAAA,IAAI,CAAC,QAAQ;AACd,aAAA,CAAC,CAAC,IAAI,CACL,SAAS,CAAC,CAAC,CAAC,EACZ,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAI;AACnC,gBAAA,IAAI,CAAC,GAAG;AAAE,oBAAA,OAAO,EAAE,CAAC,EAAE,CAAC;AACvB,gBAAA,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU;AACzB,gBAAA,IAAI,EAAE,EAAE,IAAI,EAAE;AACZ,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;oBACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,EAAE,CAAC,IAAY,CAAC,MAAM,CAAC;AACzC,oBAAA,OAAO,EAAE,CAAC,EAAE,CAAC,IAAW,CAAC;;gBAE3B,IAAI,EAAE,EAAE,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE;AACjC,oBAAA,IAAI;AACF,wBAAA,MAAM,GAAG,GAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;wBACjF,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM;AAAE,4BAAA,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;wBACnE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC;AACpC,wBAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE;4BACjD,YAAY,EAAE,EAAE,CAAC,YAAY;4BAC7B,KAAK;AACL,4BAAA,QAAQ,EAAE,GAAG;AACd,yBAAA,CAAC;AACF,wBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,wBAAA,MAAM,GAAG,GAAI,IAAI,CAAC;AACf,6BAAA,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG;AACvB,6BAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAS,KAAI;4BAChB,MAAM,OAAO,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,IAAI,EAAE,CAAQ;4BACpD,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,aAAa,KAAK,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM;AAC3F,4BAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACvB,4BAAA,OAAO,OAAO;AAChB,yBAAC,CAAC;;AAEF,wBAAA,UAAU,CAAC,CAAC,GAAG,KAAI;AACjB,4BAAA,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,GAAG,CAAC;AACzE,4BAAA,OAAQ,IAAI,CAAC,IAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CACrC,GAAG,CAAC,CAAC,GAAQ,KAAI;AACf,gCAAA,MAAM,OAAO,GAAG,GAAG,IAAI,EAAE;gCACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AAChC,gCAAA,OAAO,OAAO;6BACf,CAAC,CACH;AACH,yBAAC,CAAC,EACF,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAC1C;AACH,wBAAA,OAAO,GAAiC;;AACxC,oBAAA,MAAM;AACN,wBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,wBAAA,OAAO,EAAE,CAAC,EAAE,CAAC;;;AAGjB,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,gBAAA,OAAO,EAAE,CAAC,EAAE,CAAC;AACf,aAAC,CAAC,EACF,WAAW,CAAC,CAAC,CAAC,CACf;;QAEH,OAAO,IAAI,CAAC,QAAQ;;IAGtB,QAAQ,GAAA;AACN,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;;IAE7D,QAAQ,GAAA;AACN,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;QAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;;AAE1E,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;QAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;;AAE3E,IAAA,OAAO,CAAC,IAAc,EAAA;AACpB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;;AAEpD,IAAA,QAAQ,CAAC,CAAsB,EAAA;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;;IAG3B,aAAa,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,SAAS,CAAC,CAAC,KAAK,KACd,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAClC,GAAG,CAAC,CAAC,OAAO,KAAI;AACd,YAAA,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAChD,YAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAe;AACrC,YAAA,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE;AACtB,gBAAA,MAAM,GAAG,GAAI,EAAU,GAAG,OAAO,CAAC;AAClC,gBAAA,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;AAC3C,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AAAE,oBAAA,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,EAAE,CAAC;;YAE5B,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM;gBACvD,GAAG;AACH,gBAAA,KAAK,EAAE,GAAG;AACX,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CACH,CACF,CACF;;uGA9IQ,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAf,eAAe,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;MCPY,eAAe,CAAA;AAC1B,IAAA,aAAa,CAAC,MAAyB,EAAA;QACrC,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,UAAU;QAC7C,MAAM,OAAO,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,SAAS;QACpD,MAAM,KAAK,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,UAAU;AACjD,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAE;AACd,YAAA,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE;AACpB,YAAA,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE;AAChB,YAAA,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;AAC1B,SAAA,CAAC,MAAM,CAAC,OAAO,CAAC;AACjB,QAAA,OAAO,OAAO;;AAGhB,IAAA,aAAa,CAAC,MAAyB,EAAA;AACrC,QAAA,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI;AACtB,QAAA,IAAI,CAAC,CAAC;AAAE,YAAA,OAAO,EAAE;QACjB,MAAM,IAAI,GAAa,EAAE;QACzB,IAAI,CAAC,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,CAAC,CAAC,MAAM,CAAA,CAAE,CAAC;QACvD,IAAI,CAAC,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,CAAC,CAAC,MAAM,CAAA,CAAE,CAAC;QACvD,IAAI,CAAC,CAAC,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,CAAA,iBAAA,EAAoB,CAAC,CAAC,MAAM,CAAA,CAAE,CAAC;QACvD,IAAI,CAAC,CAAC,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,CAAA,eAAA,EAAkB,CAAC,CAAC,YAAY,CAAA,CAAE,CAAC;AACjE,QAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,CAAA,oBAAA,EAAuB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAA,CAAE,CAAC;AACzE,QAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,CAAA,kBAAA,EAAqB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAA,CAAE,CAAC;AACnE,QAAA,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI;YAC3B,IAAI,CAAC,IAAI,CAAC,CAAA,qBAAA,EAAwB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAA,GAAA,CAAK,CAAC;QAC1D,MAAM,IAAI,GAAG,CAAA,MAAA,EAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG;AACvC,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;QACvD,OAAO,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI;;uGA5BzB,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAiClC,SAAS,WAAW,CAAC,GAAW,EAAA;;IAE9B,MAAM,MAAM,GAAG,oDAAoD;IACnE,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAChC;;MCvBa,8BAA8B,CAAA;AAKrB,IAAA,IAAA;AAJX,IAAA,MAAM;IACN,KAAK,GAAU,EAAE;IACjB,KAAK,GAA0B,OAAO;AAE/C,IAAA,WAAA,CAAoB,IAAqB,EAAA;QAArB,IAAA,CAAA,IAAI,GAAJ,IAAI;;AAExB,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AACjD,QAAA,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;AAE/C,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;;IAG7C,UAAU,GAAA;AACR,QAAA,QAAQ,IAAI,CAAC,KAAK;AAChB,YAAA,KAAK,MAAM,EAAE,OAAO,cAAc;AAClC,YAAA,KAAK,MAAM,EAAE,OAAO,cAAc;AAClC,YAAA,SAAS,OAAO,eAAe;;;IAInC,MAAM,GAAA;AACJ,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,MAAM,MAAM,MAAM;;AAG5D,IAAA,OAAO,GAAG,CAAC,IAAS,KAAK,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AACjF,IAAA,OAAO,GAAG,CAAC,IAAS,KAAK,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AACjF,IAAA,SAAS,GAAG,CAAC,IAAS,KAAK,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC;AACrF,IAAA,IAAI,GAAG,CAAC,IAAS,KAAK,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IAC3E,YAAY,CAAC,IAAS,EAAE,IAAY,EAAA;;AAElC,QAAA,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,KAAI;AAC9D,YAAA,IAAI;AACF,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAS,MAAM,GAAG,IAAI,IAAI,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;AAC3G,gBAAA,OAAO,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;;AACzC,YAAA,MAAM;AACN,gBAAA,OAAO,EAAE;;AAEb,SAAC,CAAC;;IAEJ,eAAe,GAAA;AACb,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,UAAiB;AACxC,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAG,CAAC,EAAE,eAAe,KAAK,KAAK;QAC5C,OAAO,GAAG,IAAI,OAAO;;IAEvB,YAAY,GAAA;QACV,OAAS,IAAI,CAAC,MAAM,EAAE,UAAkB,EAAE,YAAoB,IAAI,cAAc;;IAGlF,QAAQ,CAAC,KAAa,EAAE,WAA4B,EAAA;AAClD,QAAA,MAAM,CAAC,GAAG,OAAO,WAAW,KAAK,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,GAAG,CAAC;AACxF,QAAA,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG;AAAE,YAAA,OAAO,MAAM;AAC3B,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG;AAAE,YAAA,OAAO,WAAW;AACtC,QAAA,OAAO,aAAa;;;AAItB,IAAA,YAAY,GAAG,CAAC,CAAS,KAAK,CAAC;uGA7DpB,8BAA8B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjB3C,w5JAuFA,EAAA,MAAA,EAAA,CAAA,quFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3EY,YAAY,4HAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKzD,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAR1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,UAAA,EACxB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,CAAC,EAAA,eAAA,EAGpD,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,w5JAAA,EAAA,MAAA,EAAA,CAAA,quFAAA,CAAA,EAAA;iFAGtC,MAAM,EAAA,CAAA;sBAAd;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;;;AEjBH;;;;AAIG;AACG,SAAU,yBAAyB,CAAC,GAAqB,EAAE,UAAoB,EAAA;AACnF,IAAA,MAAM,KAAK,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,QAAA,OAAO,GAAG;AAC7B,IAAA,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;AAClC,IAAA,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO;AACnC,IAAA,IAAI,CAAC,YAAY;QAAE,OAAO,GAAG,CAAC;AAE9B,IAAA,MAAM,MAAM,GAAG,CAAC,KAAe,KAC7B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS;IAEtE,MAAM,WAAW,GACf,MAAM,CAAC,CAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;IAC7E,MAAM,aAAa,GACjB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,IAAI,6CAA6C,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7F,QAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC;AACtC,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,KAAI;QACpC,MAAM,CAAC,GAAQ,EAAE,GAAI,KAAK,CAAC,UAAkB,EAAE;AAC/C,QAAA,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC;QACjC,IAAI,aAAa,EAAE;AACjB,YAAA,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC;YACrC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAK,EAAU;AAC1C,YAAA,MAAM,GAAG,GAAG,MAAM,CAAE,KAAK,CAAC,MAAc,CAAC,KAAK,CAAC,IAAI,CAAC;AACnD,YAAA,KAAK,CAAC,MAAc,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAQ;;QAEvD,IAAI,YAAY,EAAE;;AAEhB,YAAA,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC;;AAEhC,QAAA,KAAa,CAAC,UAAU,GAAG,CAAC;AAC/B,KAAC,CAAC;AACF,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,QAAQ,CAAC,KAAa,EAAA;AAC7B,IAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,GAAG,EAAS;AAC/D;AACA,SAAS,QAAQ,CAAC,KAAa,EAAA;AAC7B,IAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,GAAG,EAAS;AAC/D;;MCytBa,sBAAsB,CAAA;AACxB,IAAA,MAAM;AACN,IAAA,MAAM;AAEf,IAAA,OAAO,GAAyB;AAC9B,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE;QAC9E,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;QAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACtE,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;KAC3C;AAED,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AAC9C,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAU,IAAI,CAAC;AAC7C,IAAA,OAAO,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;IAErC,WAAW,GAAG,EAAE;IAChB,QAAQ,GAAG,EAAE;IAErB,MAAM,GAAa,EAAE;IACb,gBAAgB,CAAU;AAClC,IAAA,SAAS;IACT,OAAO,GAAmB,KAAK;AAC/B,IAAA,cAAc,GAA2K,EAAE,IAAI,EAAE,MAAM,EAAS;AAChN,IAAA,gBAAgB,GAA2K,EAAE,IAAI,EAAE,MAAM,EAAS;AAClN,IAAA,WAAW,GAA6Q,EAAE,IAAI,EAAE,MAAM,EAAS;AAC/S,IAAA,qBAAqB;IACrB,eAAe,GAA0O,EAAS;AAClQ,IAAA,cAAc,GAA4I,EAAE,IAAI,EAAE,MAAM,EAAS;IACjL,OAAO,GAA6B,EAAE;IAC9B,YAAY,GAAG,KAAK;;IAG5B,iBAAiB,GAAa,EAAE;IAChC,oBAAoB,GAAW,KAAK;IACpC,6BAA6B,GAAG,KAAK;IACrC,oBAAoB,GAAG,KAAK;;IAG5B,QAAQ,GAA2E,EAAE;IACrF,eAAe,GAAG,IAAI;IACtB,YAAY,GAA8C,cAAc;IAEhE,IAAI,GAAmC,IAAI;AAC3C,IAAA,mBAAmB,GAAG,IAAI,OAAO,EAAU;AAEnD,IAAA,WAAA,CAAyC,QAAc,EAAA;;AAErD,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,kBAAyB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAmC;QACnG,MAAM,GAAG,GAAI,QAAQ,EAAE,MAA2B,IAAI,IAAI,CAAC,MAAM;QACjE,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;;YAEnD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,UAAiB,CAAC;;QAEnE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AAC/C,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW;;QAEhC,IAAI,CAAC,kBAAkB,EAAE;AACzB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,IAAI,EAAE,CAAC;;AAE3E,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC;AAC/C,QAAA,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACpC,YAAA,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACpC,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,OAAO,IAAI,GAAG,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;;;AAI5C,IAAA,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtC,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAG,IAAI,CAAC,cAAsB,EAAE,IAAI,EAAE,CAAC;QACtF,IAAI,MAAM,IAAI,IAAI;YAAE;QACpB,IAAI,CAAC,cAAc,GAAG,EAAE,IAAI,IAAI,CAAC,cAAc,IAAI,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAS;QAClH,IAAI,CAAC,gBAAgB,EAAE;;IAEzB,MAAM,eAAe,CAAC,KAAa,EAAA;AACjC,QAAA,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,EAAE;AACpD,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3D,IAAI,MAAM,IAAI,IAAI;YAAE;AACpB,QAAA,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AACtC,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;AAChD,QAAA,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;AACrC,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;QACnB,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,IAAA,MAAM,kBAAkB,GAAA;AACtB,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,qBAAqB,IAAI,EAAE,EAAE,CAAC;QACpF,IAAI,MAAM,IAAI,IAAI;YAAE;AACpB,QAAA,IAAI,CAAC,qBAAqB,GAAG,MAAM;QACnC,IAAI,CAAC,gBAAgB,EAAE;;IAGzB,gBAAgB,GAAA;;QAEd,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;;IAGlD,MAAM,GAAA;QACJ,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;;AAG1C,IAAA,SAAS,CAAC,GAAqB,EAAA;AACrC,QAAA,MAAM,GAAG,GAAyB;AAChC,YAAA,GAAG,GAAG;AACN,YAAA,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE;AAChC,YAAA,MAAM,EAAE;AACN,gBAAA,OAAO,EAAG,GAAG,CAAC,MAAM,EAAE,OAAe,IAAI,MAAM;AAC/C,gBAAA,KAAK,EAAG,GAAG,CAAC,MAAM,EAAE,KAAa,IAAI,CAAC;AACtC,gBAAA,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,SAAS;AACzC,gBAAA,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,IAAI,SAAS;AAC3C,gBAAA,KAAK,EAAG,GAAG,CAAC,MAAM,EAAE,KAAa,IAAI,UAAU;AAC/C,gBAAA,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO;AAC5B,gBAAA,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB;AACpD,gBAAA,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa;AACzC,aAAA;AACD,YAAA,SAAS,EAAE;AACT,gBAAA,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,MAAM;AACnC,gBAAA,eAAe,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe;AAC/C,gBAAA,eAAe,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe;AAC/C,gBAAA,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,SAAS;AACnC,gBAAA,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,IAAI,OAAO;AACzC,aAAA;AACD,YAAA,IAAI,EAAE;AACJ,gBAAA,IAAI,EAAG,GAAG,CAAC,IAAI,EAAE,IAAY,IAAI,UAAU;AAC3C,gBAAA,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;AAChE,gBAAA,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM;AACxB,gBAAA,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM;AACxB,gBAAA,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM;AACxB,gBAAA,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE,YAAY;AACpC,gBAAA,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK;AACvB,aAAA;AACD,YAAA,IAAI,EAAG,GAAG,CAAC,IAAY,IAAI,EAAE;SAC9B;AACD,QAAA,OAAO,GAAG;;;IAIJ,kBAAkB,GAAA;AACxB,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CACH,YAAY,CAAC,GAAG,CAAC,EACjB,oBAAoB,EAAE,EACtB,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAClC,SAAS,CAAC,CAAC,EAAE,KAAI;YACf,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE;YAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACvB,gBAAA,IAAI,CAAC,MAAM,GAAG,EAAE;AAChB,gBAAA,OAAO,EAAE,CAAC,EAAE,CAAC;;AAEf,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBACzB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;;AAC3D,YAAA,MAAM;AACN,gBAAA,OAAO,EAAE,CAAC,EAAE,CAAC;;AAEjB,SAAC,CAAC,EACF,kBAAkB,EAAE;AAErB,aAAA,SAAS,CAAC,CAAC,MAAW,KAAI;AACzB,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,EAAE;AACxB,iBAAA,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG;iBAC7C,MAAM,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,CAAC,CAAa;AACtC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,MAAM,EAAE;AACf,SAAC,CAAC;;AAGN,IAAA,oBAAoB,CAAC,KAAa,EAAA;QAChC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;AAGf,IAAA,eAAe,CAAC,MAAiG,EAAA;QAC/G,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK;AAC9C,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;YAC7C,QAAQ,MAAM;AACZ,gBAAA,KAAK,WAAW;oBACd,KAAK,CAAC,IAAI,GAAG;AACX,wBAAA,IAAI,EAAE,WAAW;AACjB,wBAAA,MAAM,EAAE,QAAQ;AAChB,wBAAA,MAAM,EAAE,6BAA6B;AACrC,wBAAA,MAAM,EAAE,4BAA4B;AACpC,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;AAC1C,wBAAA,KAAK,EAAE,YAAY;qBACb;oBACR;AACF,gBAAA,KAAK,eAAe;oBAClB,KAAK,CAAC,IAAI,GAAG;AACX,wBAAA,IAAI,EAAE,eAAe;AACrB,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;AACxD,wBAAA,MAAM,EAAE,MAAM;AACd,wBAAA,MAAM,EAAE,8BAA8B;AACtC,wBAAA,KAAK,EAAE,YAAY;qBACb;oBACR;AACF,gBAAA,KAAK,OAAO;oBACV,KAAK,CAAC,IAAI,GAAG;AACX,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,MAAM,EAAE,MAAM;AACd,wBAAA,MAAM,EAAE,kCAAkC;AAC1C,wBAAA,YAAY,EAAE,MAAM;AACpB,wBAAA,MAAM,EAAE,6BAA6B;AACrC,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;AAC1C,wBAAA,KAAK,EAAE,YAAY;qBACb;oBACR;AACF,gBAAA,KAAK,UAAU;AACf,gBAAA;oBACE,KAAK,CAAC,IAAI,GAAG;AACX,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,MAAM,EAAE,SAAS;AACjB,wBAAA,MAAM,EAAE,6BAA6B;AACrC,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;AAC1C,wBAAA,KAAK,EAAE,YAAY;qBACb;oBACR;AACF,gBAAA,KAAK,SAAS;oBACZ,KAAK,CAAC,IAAI,GAAG;AACX,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,MAAM,EAAE,SAAS;AACjB,wBAAA,MAAM,EAAE,MAAM;AACd,wBAAA,MAAM,EAAE,2BAA2B;AACnC,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;AAC1C,wBAAA,KAAK,EAAE,YAAY;qBACb;oBACR;AACF,gBAAA,KAAK,MAAM;oBACT,KAAK,CAAC,IAAI,GAAG;AACX,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,MAAM,EAAE,QAAQ;AAChB,wBAAA,MAAM,EAAE,MAAM;AACd,wBAAA,MAAM,EAAE,4BAA4B;AACpC,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;AAC1C,wBAAA,KAAK,EAAE,YAAY;qBACb;oBACR;AACF,gBAAA,KAAK,aAAa;oBAChB,KAAK,CAAC,IAAI,GAAG;AACX,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,MAAM,EAAE,SAAS;AACjB,wBAAA,MAAM,EAAE,qEAAqE;AAC7E,wBAAA,MAAM,EAAE,kCAAkC;AAC1C,wBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;AAC1C,wBAAA,KAAK,EAAE,YAAY;qBACb;oBACR;;AAEN,SAAC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;AAGf,IAAA,WAAW,GAAG;QACZ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE;QAClH,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE;QAC/G,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE;KACzG;IACD,gBAAgB,GAA0B,OAAO;IAEjD,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAU,KAAI;YAClD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE;YACnC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACtG,SAAC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;AAEf,IAAA,YAAY,CAAC,GAAW,EAAA;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAU,KAAI;AAClD,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAChE,SAAC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;IAEf,gBAAgB,GAAA;QACd,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;IAGf,SAAS,GAAA;;;;IAKT,KAAK,GAAA;AACH,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;AAC3C,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM;AACrB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW;AAChC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACzB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;gBAChB;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;;;IAI5B,eAAe,GAAA;QACb,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;IAGf,kBAAkB,GAAA;QAChB,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;IAGf,aAAa,GAAA;QACX,IAAI,CAAC,SAAS,EAAE;;AAGlB,IAAA,gBAAgB,CAAC,KAAU,EAAA;AACzB,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9D,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AAC5C,YAAA,KAAK,CAAC,MAAc,CAAC,QAAQ,GAAG,KAAK;AACxC,SAAC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;;AAIP,IAAA,kBAAkB;IAE1B,gBAAgB,GAAA;AACd,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE;AAC3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK;AACjC,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;YAC7C,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,IAAK,EAAU;AAClD,YAAA,IAAI,KAAK;AAAE,gBAAA,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC;;AAChD,gBAAA,KAAK,CAAC,UAAkB,CAAC,IAAI,GAAG,SAAgB;AACxD,SAAC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;IAGf,aAAa,GAAA;QACX,MAAM,CAAC,GAAQ,EAAE,GAAI,IAAI,CAAC,OAAO,CAAC,UAAkB,EAAE;AACtD,QAAA,MAAM,KAAK,GAAG,CAAC,IAAS,KAA6B;YACnD,IAAI,CAAC,IAAI,EAAE,KAAK;AAAE,gBAAA,OAAO,SAAS;YAClC,MAAM,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG;AACzC,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAS;AAC1G,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;AAAE,gBAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAS;AAC5J,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAS;AAC9G,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;gBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE;gBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;gBAC/B,MAAM,KAAK,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE;AACzD,gBAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAS;;AAEnH,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;gBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;gBACpC,IAAI,KAAK,GAAG,EAAE;gBACd,IAAI,GAAG,IAAI,KAAK;AAAE,oBAAA,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK;AACtC,qBAAA,IAAI,GAAG;oBAAE,KAAK,GAAG,GAAG;AACpB,qBAAA,IAAI,KAAK;AAAE,oBAAA,KAAK,GAAG,GAAG,GAAG,KAAK;AACnC,gBAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAS;;AAE/G,YAAA,OAAO,SAAS;AAClB,SAAC;QAED,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;QACpC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,SAAS;AAE/E,QAAA,IAAI,CAAC;AAAE,YAAA,CAAC,CAAC,OAAO,GAAG,CAAC;QACpB,IAAI,CAAC,EAAE;AACL,YAAA,CAAC,CAAC,SAAS,GAAG,CAAC;;AAEf,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAY,CAAC,IAAI,CAAC;YAClE,IAAI,YAAY,GAAG,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAQ;;QAE5D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,MAAM,MAAM,MAAM,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE;AAC5G,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAI;AAClD,gBAAA,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,GAAG,GAAG;AACjC,gBAAA,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,6BAA6B;AAAE,oBAAA,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG;AAC7E,gBAAA,OAAO,KAAK;AACd,aAAC,CAAC;AACF,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,IAAI,GAAG;AAC5C,YAAA,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAS;;aAChH,IAAI,CAAC,EAAE;AACZ,YAAA,CAAC,CAAC,IAAI,GAAG,CAAC;;AAEZ,QAAA,IAAI,EAAE;AAAE,YAAA,CAAC,CAAC,QAAQ,GAAG,EAAE;QACvB,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE;AACvG,YAAA,CAAC,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,EAAiB;;QAEpF,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;YAChH,CAAC,CAAC,OAAO,GAAG;AACV,gBAAA,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACzC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG;AACrC,oBAAA,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS;AACnC,oBAAA,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,UAAiB;AAC5C,oBAAA,OAAO,EAAG,IAAI,CAAC,cAAc,CAAC,YAAoB,IAAI,QAAQ;iBAC/D,GAAG,SAAS;aACP;;AAGV,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE;YAC9B,CAAS,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS;;AAEtD,QAAA,CAAS,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,qBAAqB,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,SAAS;;QAElF,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACzC,YAAA,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;AACf,iBAAA,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;AAC5C,iBAAA,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;;aACxE;AACL,YAAA,CAAC,CAAC,QAAQ,GAAG,SAAgB;;AAE9B,QAAA,CAAS,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe;AAChD,QAAA,CAAS,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;AAE3C,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,KAAI;AAC5C,YAAA,KAAa,CAAC,UAAU,GAAG,CAAC;AAC/B,SAAC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;AACb,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;;IAGnB,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,aAAa,EAAE;;;IAIxB,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B,IAAI,CAAC,mCAAmC,EAAE;;QAE5C,IAAI,CAAC,MAAM,EAAE;;IAGf,UAAU,GAAA;QACR,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAClE,IAAI,CAAC,iBAAiB,EAAE;;AAE1B,IAAA,aAAa,CAAC,GAAW,EAAA;AACvB,QAAA,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AACtC,QAAA,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAClB,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;QACnB,IAAI,CAAC,iBAAiB,EAAE;;IAE1B,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;AAM1B,IAAA,kBAAkB,CAAC,KAAa,EAAE,OAA+C,EAAE,KAAa,EAAA;AAC9F,QAAA,MAAM,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,GAAG;QACrC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;;AAEnD,IAAA,eAAe,CAAC,KAAa,EAAE,OAA+C,EAAE,IAAY,EAAA;QAC1F,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC;;AAElD,IAAA,eAAe,CAAC,KAAa,EAAE,OAA+C,EAAE,IAAY,EAAE,KAAa,EAAA;QACzG,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM;AAC5D,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK;AACzC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK;QACnD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;;AAE1F,IAAA,qBAAqB,CAAC,KAAa,EAAE,OAA+C,EAAE,IAAY,EAAA;QACxG,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM;AAC5D,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK;AACzC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,EAAE;AAC9C,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAC/D,QAAA,MAAM,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,MAAM;QACpC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC;;AAEnD,IAAA,iBAAiB,CAAC,KAAa,EAAE,OAA+C,EAAE,OAAe,EAAE,QAAgB,EAAA;AACzH,QAAA,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AACtC,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;AAChD,QAAA,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE;AACtC,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;QACnB,IAAI,CAAC,iBAAiB,EAAE;;QAExB,UAAU,CAAC,MAAK;AACd,YAAA,IAAI;gBACF,OAAO,CAAC,KAAK,EAAE;AACf,gBAAA,OAAO,CAAC,cAAc,GAAG,QAAQ;AACjC,gBAAA,OAAO,CAAC,YAAY,GAAG,QAAQ;;YAC/B,MAAM;AACV,SAAC,CAAC;;;AAII,IAAA,4BAA4B,CAAC,KAAW,EAAA;AAC9C,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,SAAS,GAAG,CAAC,IAAa,KAAwC;AACtE,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,EAAE;YACpB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC;YAChD,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE;AACjC,SAAC;AACD,QAAA,MAAM,aAAa,GAAG,CAAC,KAAc,KAAgD;AACnF,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,EAAE;AACrB,YAAA,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa;YACtF,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;AAC5C,SAAC;AACD,QAAA,MAAM,SAAS,GAAG,CAAC,KAAc,KAA0C;AACzE,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,EAAS;YAC5B,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;YACvD,IAAI,EAAE,IAAI,EAAE;gBAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAS,EAAE;YACzD,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC;AAAE,gBAAA,OAAO,EAAE,SAAS,EAAE,EAAS,EAAE;AACxF,YAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAS;AAC9B,SAAC;AAED,QAAA,IAAI,KAAK,CAAC,OAAO,EAAE;AACjB,YAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AACtD,YAAA,MAAM,IAAI,GAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE;AACvH,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AAChF,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AACxE,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;;AAE5B,QAAA,IAAI,KAAK,CAAC,SAAS,EAAE;AACnB,YAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AACxD,YAAA,MAAM,IAAI,GAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE;AAC7H,YAAA,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AAClF,YAAA,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AAC1E,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;;AAE9B,QAAA,IAAI,KAAK,CAAC,IAAI,EAAE;AACd,YAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AACnD,YAAA,MAAM,IAAI,GAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE;AAC9G,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AAC7E,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AACrE,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YACvB,IAAI,KAAK,CAAC,aAAa;gBAAE,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,KAAK,CAAC,aAAa;YACzE,IAAK,KAAa,CAAC,cAAc;AAAE,gBAAA,IAAI,CAAC,qBAAqB,GAAI,KAAa,CAAC,cAAc;AAC7F,YAAA,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK;gBAAE,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK;AACpE,YAAA,IAAI,KAAK,CAAC,IAAI,EAAE,OAAO;gBAAE,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO;;YAE1E,IAAI,OAAO,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACjF,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC;AAClG,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,CAAC,CAAW,CAAC;AACjH,gBAAA,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;AACvB,oBAAA,IAAI,CAAC,iBAAiB,GAAG,OAAc;AACvC,oBAAA,IAAI,CAAC,oBAAoB,GAAG,QAAe;AAC3C,oBAAA,IAAI,CAAC,6BAA6B,GAAG,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;AAIjG,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AACvD,YAAA,MAAM,IAAI,GAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE;AAC1H,YAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AACjF,YAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AACzE,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK;gBAAE,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK;AAChF,YAAA,IAAI,KAAK,CAAC,QAAQ,EAAE,OAAO;gBAAE,IAAI,CAAC,eAAe,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO;;AAExF,QAAA,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC5E,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAS;;AAClE,aAAA,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE;YACpF,IAAI,CAAC,cAAc,GAAG;AACpB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;AAC5B,gBAAA,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI;AACrC,gBAAA,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK;AACvC,gBAAA,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO;aACrC;;QAGV,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;;QAElH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,KAAK,KAAK;QACtD,IAAI,CAAC,YAAY,GAAI,KAAK,CAAC,YAAoB,IAAI,cAAc;;IAGnE,SAAS,GAAA;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW,CAAC;;IAElD,MAAM,GAAA;;AAEJ,QAAA,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,IAAI,EAAE,EAAE,IAAI,EAAE;QAChE,MAAM,WAAW,GAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAgB;AAC3D,QAAA,MAAM,WAAW,GAAG,WAAW,IAAI,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAY;AAChD,QAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE;QAE/C,IAAI,KAAK,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,EAAE;YAAE,KAAK,GAAG,KAAK;AACtB,QAAA,IAAI,WAAW,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;YAAE,KAAK,GAAG,KAAK;AAC5F,QAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAE,KAAK,GAAG,KAAK;AACrD,QAAA,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,KAAK,GAAG,KAAK;;AAGtF,QAAA,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE;AACnE,QAAA,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,KAAK,GAAG,KAAK;AAEtF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;IAG3B,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM;YAAE;AAC1B,QAAA,MAAM,OAAO,GAAG,yBAAyB,CAAC,IAAI,CAAC,OAAc,EAAE,IAAI,CAAC,MAAM,CAAC;AAC3E,QAAA,IAAI,CAAC,OAAO,GAAG,OAAc;;QAE7B,IAAI,CAAC,4BAA4B,CAAE,IAAI,CAAC,OAAe,CAAC,UAAU,CAAC;QACnE,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,MAAM,EAAE;;;IAIf,mCAAmC,GAAA;AACjC,QAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE;AACpB,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AAC7F,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;AAC3C,QAAA,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE;YACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC;AACxE,YAAA,IAAI,GAAG,IAAI,CAAC,EAAE;;gBAEZ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI;oBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;;iBAC3D;AACL,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;;;AAGrB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,cAAc;QACvD,IAAI,CAAC,iBAAiB,EAAE;;IAE1B,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM;AAAE,YAAA,OAAO,EAAE;AAC9C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAI;AAClD,YAAA,MAAM,KAAK,GAAG,SAAS,GAAG,CAAC,GAAG,GAAG;AACjC,YAAA,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,6BAA6B;AAAE,gBAAA,OAAO,GAAG,GAAG,KAAK,GAAG,GAAG;AAC7E,YAAA,OAAO,KAAK;AACd,SAAC,CAAC;AACF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,IAAI,GAAG;AAC5C,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;AAEhB,IAAA,WAAW,CAAC,KAAa,EAAA;QAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE;AACrC,QAAA,IAAI,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,cAAc;AAC3E,QAAA,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,UAAU;AACrD,QAAA,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,MAAM;AAChD,QAAA,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,eAAe;AAC1C,QAAA,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,QAAQ;AACrD,QAAA,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,aAAa;AACtD,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,MAAM;AACnC,QAAA,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,OAAO;AACzC,QAAA,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,MAAM;AAClC,QAAA,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,MAAM;AAChD,QAAA,OAAO,EAAE;;AAzpBA,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,kBA8Cb,mBAAmB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AA9C5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtrBvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkqBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+gBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAnrBC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,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,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,8BAAA,EAAA,gCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,YAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,mBAAmB,yFACnB,8BAA8B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAwrBrB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA3sBlC,SAAS;+BACE,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,aAAa;wBACb,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,eAAe;wBACf,oBAAoB;wBACpB,aAAa;wBACb,kBAAkB;wBAClB,qBAAqB;wBACrB,gBAAgB;wBAChB,gBAAgB;wBAChB,cAAc;wBACd,mBAAmB;wBACnB,8BAA8B;qBAC/B,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkqBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,+gBAAA,CAAA,EAAA;;0BAkEY,MAAM;2BAAC,mBAAmB;yCA7C9B,MAAM,EAAA,CAAA;sBAAd;gBACQ,MAAM,EAAA,CAAA;sBAAd;;;MCjtBU,UAAU,CAAA;AACZ,IAAA,MAAM;AACN,IAAA,IAAI;AAEH,IAAA,SAAS,GAAG,IAAI,YAAY,EAAiB;AAC7C,IAAA,WAAW,GAAG,IAAI,YAAY,EAAmB;AACjD,IAAA,eAAe,GAAG,IAAI,YAAY,EAAsB;AAElE,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,QAAQ;AACR,IAAA,MAAM;AACN,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;;AAGxC,IAAA,YAAY,GAA4C,IAAI,WAAW,CAErE,IAAI,CAAC;IACP,WAAW,GAAG,EAAE;IAChB,SAAS,GAAG,EAAE;AAEG,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,IAAA,IAAI,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,eAAe,GAAG,IAAI,GAAG,EAAU;AAE1B,IAAA,IAAI,GAAG,MAAM,CAAuB,eAAsB,CAAC;AAC3D,IAAA,QAAQ,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACvC,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAEhD,QAAQ,GAAA;QACN,IAAI,CAAC,gBAAgB,EAAE;;AAEvB,QAAA,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ;QAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;QAC9B,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,UAAU,EAAE;;AAGnB,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;;;AAGrB,YAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW;gBAAE;YACnC,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ;YAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;YAC9B,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,UAAU,EAAE;;;IAIb,gBAAgB,GAAA;AACtB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAC1B,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CACnC,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAE,CAC3B;QACD,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;;;IAI1B,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACjE,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;;IAGvD,aAAa,GAAA;AACX,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,MAAM,MAAM,MAAM;;IAG5D,kBAAkB,GAAA;AAChB,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,MAAM,MAAM,MAAM;;IAGpD,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;;AAE9B,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChC;;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,MAAM;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe;QACpD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE;AAC/B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAK,CAAC,GAAG,IAAI;AAC5E,YAAA,IAAI,IAAI,YAAY,WAAW,EAAE;AAC/B,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAwB;gBAC5C;;;;AAIJ,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,WAAW,CACjC,IAAI,KAAK,UAAU,GAAI,EAAgB,GAAG,IAAI,CAC/C;;AAGH,IAAA,OAAO,GAAG,CAAC,IAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;AACvD,IAAA,OAAO,GAAG,CAAC,IAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;AACvD,IAAA,SAAS,GAAG,CAAC,IAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;AAC3D,IAAA,IAAI,GAAG,CAAC,IAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;AACjD,IAAA,QAAQ,GAAG,CAAC,IAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IACzD,aAAa,GAAG,CAAC,GAAW,KAC1B,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,IAAI,GAAG;IACjF,YAAY,CAAC,IAAS,EAAE,IAAY,EAAA;AAClC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;;IAE9C,eAAe,GAAA;AACb,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU;AACjC,QAAA,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAG,CAAC,EAAE,eAAe,KAAK,KAAK;QAC5C,OAAO,GAAG,IAAI,OAAO;;IAEvB,YAAY,GAAA;QACV,OAAQ,IAAI,CAAC,MAAM,EAAE,UAAkB,EAAE,YAAY,IAAI,cAAc;;IAGzE,WAAW,GAAA;AACT,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;;IAExE,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;;IAEtD,aAAa,GAAA;AACX,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;;AAGrD,IAAA,cAAc,CAAC,IAAS,EAAA;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE;AAC1C,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;YAC1B,IAAI,CAAC,CAAC,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI;;AAE1B,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;YAC5C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;AAC1E,YAAA,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE;gBACzB,MAAM,GAAG,GAAG;qBACT,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,KAAI;AACrC,oBAAA,IAAI;wBACF,OAAO,MAAM,CACX;6BACG,KAAK,CAAC,GAAG;AACT,6BAAA,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAS,KAAK,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CACvD;;AACD,oBAAA,MAAM;AACN,wBAAA,OAAO,EAAE;;AAEb,iBAAC;AACA,qBAAA,IAAI,EAAE;gBACT,OAAO,GAAG,KAAK,KAAK;;AAEtB,YAAA,OAAO,IAAI;AACb,SAAC,CAAC;;AAGJ,IAAA,WAAW,CAAC,IAAS,EAAE,KAAa,EAAE,OAAgB,EAAA;AACpD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;AAG/C,IAAA,aAAa,CAAC,EAAc,EAAE,QAAgB,EAAE,IAAS,EAAE,KAAa,EAAA;QACtE,EAAE,CAAC,eAAe,EAAE;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;AAGlD,IAAA,iBAAiB,CAAC,OAA+B,EAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AACxB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK;AACnC,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;AAC/D,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;IAG7D,gBAAgB,GAAA;QACd,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,SAAS;AACvC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC7B,EAAE,EAAE,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAE;AAC9B,YAAA,KAAK,EAAE,uBAAuB;AAC9B,YAAA,OAAO,EAAE;AACP,gBAAA,SAAS,EAAE,sBAAsB;gBACjC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;AAC5C,aAAA;AACF,SAAA,CAAC;QAEF,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,KAAI;AACjC,YAAA,MAAM,MAAM,GAAqB,OAAO,EAAE,MAAM,IAAI,OAAO;AAC3D,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;AAC9B,SAAC,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC7B,YAAA,MAAM,MAAM,GAAqB,KAAK,EAAE,MAAM,IAAI,KAAK;YACvD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAE,EAAE,MAAM,CAAC;AAC3D,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;AAC9B,SAAC,CAAC;;IAGJ,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;;IAEtB,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;;AAEtB,IAAA,WAAW,CAAC,EAAU,EAAA;AACpB,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;;AAGrD,IAAA,eAAe,CAAC,MAAwB,EAAA;AAC9C,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;;AAEpB,QAAA,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC;;QAEzC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;;IAGR,IAAI,GAAG,MAAM,CAAC,kBAAyB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAmC;AAEvG,IAAA,4BAA4B,CAAC,GAAqB,EAAA;AACxD,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,YAAY;AACvC,QAAA,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE;AACvB,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE;AAClC,QAAA,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO;AACnC,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO;AAC1B,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,YAAA,OAAO;AACzC,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AACvB,YAAA,IAAI,CAAC;AACF,iBAAA,SAAS;AACT,iBAAA,SAAS,CAAC;AACT,gBAAA,IAAI,EAAE,CAAC,MAAa,KAAI;AACtB,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5B,oBAAA,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,EAAE;AACxB,yBAAA,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG;yBAC1C,MAAM,CAAC,OAAO,CAAa;oBAC9B,IAAI,CAAC,KAAK,CAAC,MAAM;wBAAE;oBACnB,MAAM,OAAO,GAAG,yBAAyB,CAAC,GAAG,EAAE,KAAK,CAAC;;;oBAGrD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE;AACrC,wBAAA,IAAI,CAAC,MAAM,GAAG,OAAO;;iBAExB;gBACD,KAAK,EAAE,MAAK;;AAEV,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;iBAC7B;AACF,aAAA,CAAC;;AACJ,QAAA,MAAM;;;;IAKF,QAAQ,CACd,IAA+D,EAC/D,IAAS,EAAA;QAET,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;AAC3C,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE;AAC3B,YAAA,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACpD,YAAA,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AACjE,YAAA,MAAM,YAAY,GAAG,YAAY,IAAK,IAAI,CAAC,MAAM,EAAE,IAAY,EAAE,QAAQ,IAAI,KAAK;AAClF,YAAA,MAAM,MAAM,GAAG,cAAc,IAAK,IAAI,CAAC,MAAM,EAAE,IAAY,EAAE,MAAM,IAAI,SAAS;AAChF,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC;YACnF,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACxC,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,QAAQ,EAAE,YAAY;AACvB,aAAA,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YACnB,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;;AAE3E,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AACvB,YAAA,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACpD,YAAA,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAClE,YAAA,MAAM,MAAM,GAAG,cAAc,IAAK,IAAI,CAAC,MAAM,EAAE,IAAY,EAAE,MAAM,IAAI,SAAS;YAChF,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;AAClD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;AAC/C,YAAA,MAAM,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;YACrC,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;YAC3E,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;;AAE3E,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzB,YAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7C,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,gBAAA,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG;gBACxC,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,KAAK,EAAE,GAAG,CAAC,KAAK;aACjB;;AAEH,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AACvB,YAAA,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACpD,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;YAC/C,IAAI,KAAK,EAAE;AACT,gBAAA,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AAClD,gBAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;AACvB,oBAAA,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;oBACxC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACpC,oBAAA,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC;;;;AAIhD,YAAA,IAAI,KAAK,GAAI,GAAW,CAAC,KAA2B;AACpD,YAAA,IAAI;gBACF,MAAM,GAAG,GAAI,IAAI,CAAC,MAAM,EAAE,UAAkB,EAAE,YAAkD;AAChG,gBAAA,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBACpC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;oBACvC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC;AACpC,oBAAA,IAAI,KAAK;wBAAE,KAAK,GAAG,KAAK;;;YAE1B,MAAM;;AAER,YAAA,IAAI;gBACF,MAAM,IAAI,GAAI,IAAI,CAAC,MAAM,EAAE,UAAkB,EAAE,YAAkD;AACjG,gBAAA,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBACrC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;oBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;AACpC,oBAAA,IAAI,GAAG;wBAAE,KAAK,GAAG,GAAG;;AACf,qBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACpC,oBAAA,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;;YAEjC,MAAM;AACR,YAAA,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAG,GAAW,CAAC,OAAO,EAAS;;AAEnH,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;YACvB,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAQ;;AAE9C,YAAA,IAAI;gBACF,MAAM,GAAG,GAAI,IAAI,CAAC,MAAM,EAAE,UAAkB,EAAE,YAAkD;gBAChG,IAAI,GAAG,EAAE;AACP,oBAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AAChD,oBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;AAC5C,oBAAA,MAAM,OAAO,GAAG;wBACd,MAAM;wBACN,MAAM,CAAC,WAAW,IAAI;wBACtB,IAAI;wBACJ,IAAI,CAAC,WAAW,IAAI;AACrB,qBAAA,CAAC,MAAM,CAAC,OAAO,CAAa;AAC7B,oBAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;AACvB,wBAAA,MAAM,KAAK,GAAI,GAAW,CAAC,CAAC,CAAC;wBAC7B,IAAI,KAAK,EAAE;AAAE,4BAAA,GAAG,CAAC,KAAK,GAAG,KAAK;4BAAE;;;;;YAGpC,MAAM;AACR,YAAA,OAAO,GAAG;;AAEZ,QAAA,OAAO,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC;;AAG5B,IAAA,SAAS,CAAC,IAAY,EAAA;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAC7B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE;AAChD,QAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;;AAG3E,IAAA,aAAa,CAAC,IAAY,EAAA;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAC7B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;;IAGxD,UAAU,CAAC,IAAY,EAAE,GAAQ,EAAA;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,KAAI;AAChD,YAAA,IAAI;gBACF,MAAM,KAAK,GAAG;qBACX,KAAK,CAAC,GAAG;qBACT,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAS,MAAM,GAAG,IAAI,IAAI,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;AAC3E,gBAAA,OAAO,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;;AACzC,YAAA,MAAM;AACN,gBAAA,OAAO,EAAE;;AAEb,SAAC,CAAC;;AAGI,IAAA,cAAc,CAAC,KAAc,EAAA;AACnC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;;QAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;QAC/B,IAAI,KAAK,KAAK,EAAE;AAAE,YAAA,OAAO,CAAC,SAAS,EAAE,MAAM,IAAI,SAAS,CAAC;AACzD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC,KAAK,IAAI,SAAS,EAAE,SAAS,CAAC;QAC9D,OAAO,CAAC,KAAK,IAAI,SAAS,EAAE,MAAM,IAAI,SAAS,CAAC;;AAG1C,IAAA,SAAS,CAAC,GAAQ,EAAA;QACxB,IAAI,OAAO,GAAG,KAAK,SAAS;AAAE,YAAA,OAAO,GAAG;AACxC,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAC1C,QAAA,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI;;;AAItE,IAAA,WAAW,CAAC,CAAS,EAAA;AAC3B,QAAA,IAAI;AACF,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE;AACrB,iBAAA,OAAO,CAAC,WAAW,EAAE,GAAG;AACxB,iBAAA,IAAI;AACJ,iBAAA,WAAW,EAAE;AAChB,YAAA,IAAI,CAAC,CAAC;AAAE,gBAAA,OAAO,EAAE;AACjB,YAAA,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;;AACjD,QAAA,MAAM;AAAE,YAAA,OAAO,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;;;AAG1B,IAAA,YAAY,CAAC,KAAc,EAAA;QACjC,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE;AACjC,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE;AAC/B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;AAC9B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;AAC9B,YAAA,KAAK,QAAQ;AACb,YAAA;AACE,gBAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE;;;IAIpC,QAAQ,CAAC,KAAa,EAAE,WAA4B,EAAA;AAClD,QAAA,MAAM,CAAC,GAAG,OAAO,WAAW,KAAK,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,GAAG,CAAC;AACxF,QAAA,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG;AAAE,YAAA,OAAO,MAAM;AAC3B,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG;AAAE,YAAA,OAAO,WAAW;AACtC,QAAA,OAAO,aAAa;;;AAItB,IAAA,cAAc,GAAG,CAAC,CAAS,EAAE,CAAmB,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;AAChE,IAAA,WAAW,GAAG,CAAC,CAAS,EAAE,EAAO,KAC/B,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;uGArbvF,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAV,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,SAAA,EAFV,CAAC,kBAAkB,EAAE,eAAe,CAAC,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxDlD,m5iBA4SA,EAAA,MAAA,EAAA,CAAA,kqJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlQI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,mBAAmB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAON,UAAU,EAAA,UAAA,EAAA,CAAA;kBApBtB,SAAS;+BACE,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,aAAa;wBACb,gBAAgB;wBAChB,aAAa;wBACb,mBAAmB;wBACnB,cAAc;wBACd,eAAe;wBACf,kBAAkB;wBAClB,eAAe;qBAChB,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC,CAAC,kBAAkB,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,m5iBAAA,EAAA,MAAA,EAAA,CAAA,kqJAAA,CAAA,EAAA;8BAGvC,MAAM,EAAA,CAAA;sBAAd;gBACQ,IAAI,EAAA,CAAA;sBAAZ;gBAES,SAAS,EAAA,CAAA;sBAAlB;gBACS,WAAW,EAAA,CAAA;sBAApB;gBACS,eAAe,EAAA,CAAA;sBAAxB;;;AE5DI,MAAM,8BAA8B,GAAqB;AAC9D,IAAA,EAAE,EAAE,aAAa;AACjB,IAAA,QAAQ,EAAE,aAAa;AACvB,IAAA,SAAS,EAAE,UAAU;AACrB,IAAA,YAAY,EAAE,aAAa;AAC3B,IAAA,WAAW,EAAE,yEAAyE;AACtF,IAAA,IAAI,EAAE,WAAW;AACjB,IAAA,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,2EAA2E,EAAE;QACtI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,mDAAmD,EAAE;AACtG,KAAA;AACD,IAAA,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE;QAC3E,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,wBAAwB,EAAE;QACvF,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE;AAC3F,KAAA;IACD,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC;AACrD,IAAA,GAAG,EAAE,gBAAgB;;SAGP,yBAAyB,GAAA;IACvC,OAAO;AACL,QAAA,OAAO,EAAE,uBAAuB;AAChC,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,UAAU,EAAE,CAAC,QAAmC,KAAK,MAAK;AACxD,YAAA,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC;SAClD;QACD,IAAI,EAAE,CAAC,yBAAyB,CAAC;KACtB;AACf;;ACjCA;;AAEG;;ACFH;;AAEG;;;;"}
|