@react-perfscope/ui 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shadow-mount.ts","../src/app.tsx","../src/i18n.ts","../src/widget.tsx","../src/panel.tsx","../src/overlay.ts","../src/severity.ts","../src/summary.tsx","../src/timeline.tsx","../src/render-insights.tsx","../src/inp-episode.tsx","../src/episode-shared.tsx","../src/long-task-episode.tsx","../src/filter.ts","../src/mount.tsx"],"sourcesContent":["import { render, type ComponentChild } from 'preact'\n\nconst HOST_MARKER = 'data-perfscope-host'\n\n// Thin dark scrollbar matching the panel palette. Pseudo-elements like\n// ::-webkit-scrollbar can't be set via inline styles, so we inject a\n// <style> element into the shadow root. scrollbar-width/-color cover Firefox.\nconst SCROLLBAR_CSS = `\n*::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n*::-webkit-scrollbar-track {\n background: transparent;\n}\n*::-webkit-scrollbar-thumb {\n background: #3a3a3a;\n border-radius: 4px;\n border: 2px solid transparent;\n background-clip: padding-box;\n}\n*::-webkit-scrollbar-thumb:hover {\n background: #555;\n background-clip: padding-box;\n border: 2px solid transparent;\n}\n*::-webkit-scrollbar-corner {\n background: transparent;\n}\n/* Firefox-only fallback. Chrome 121+ supports the standard scrollbar-width/\n -color too, but setting them there DISABLES the ::-webkit-scrollbar styling\n above (losing our 8px rounded thumb). Gate on lack of webkit support so only\n non-webkit engines (Firefox) pick these up. */\n@supports not selector(::-webkit-scrollbar) {\n * {\n scrollbar-width: thin;\n scrollbar-color: #3a3a3a transparent;\n }\n}\n`\n\nexport interface MountShadowOptions {\n /** Parent element under which the host div is appended. Defaults to document.body. */\n parent?: HTMLElement\n}\n\nexport function mountShadow(vnode: ComponentChild, opts: MountShadowOptions = {}): () => void {\n const parent = opts.parent ?? document.body\n const host = document.createElement('div')\n host.setAttribute(HOST_MARKER, '')\n const root = host.attachShadow({ mode: 'open' })\n parent.appendChild(host)\n render(vnode, root as unknown as Element)\n // Append after render: preact manages its own children in `root`, so adding\n // the <style> afterward keeps it outside preact's diff and prevents it from\n // being removed on re-render.\n const style = document.createElement('style')\n style.textContent = SCROLLBAR_CSS\n root.appendChild(style)\n\n let torn = false\n return () => {\n if (torn) return\n torn = true\n try {\n render(null, root as unknown as Element)\n } catch {\n // ignore\n }\n if (host.parentNode) host.parentNode.removeChild(host)\n }\n}\n","import { h } from 'preact'\nimport { useState, useRef, useEffect } from 'preact/hooks'\nimport type { Recorder, RecordingResult, StackFrame } from '@react-perfscope/core'\nimport { Widget } from './widget'\nimport { Panel } from './panel'\nimport { I18nProvider } from './i18n'\nimport type { WidgetPosition } from './types'\n\nexport interface AppProps {\n recorder: Recorder\n position?: WidgetPosition\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n finalize?: (result: RecordingResult) => Promise<RecordingResult>\n}\n\nexport function App(props: AppProps) {\n const { recorder, position = 'bottom-right', resolveFrame, finalize } = props\n const [recording, setRecording] = useState(false)\n const [result, setResult] = useState<RecordingResult | null>(null)\n const [elapsedMs, setElapsedMs] = useState(0)\n const startedAtRef = useRef<number>(0)\n const rafRef = useRef<number | null>(null)\n // Bumped on every stop; lets a slow finalize drop its result if the user\n // has already started a new recording.\n const resultTokenRef = useRef<number>(0)\n\n useEffect(() => {\n if (!recording) {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n return\n }\n const tick = () => {\n setElapsedMs(performance.now() - startedAtRef.current)\n rafRef.current = requestAnimationFrame(tick)\n }\n rafRef.current = requestAnimationFrame(tick)\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n }\n }, [recording])\n\n function onToggle() {\n if (!recording) {\n startedAtRef.current = performance.now()\n setElapsedMs(0)\n setResult(null)\n recorder.start()\n setRecording(true)\n } else {\n const r = recorder.stop()\n const token = ++resultTokenRef.current\n setRecording(false)\n setResult(r)\n if (finalize) {\n finalize(r)\n .then((enriched) => {\n if (resultTokenRef.current === token) setResult(enriched)\n })\n .catch(() => {})\n }\n }\n }\n\n function onClose() {\n setResult(null)\n }\n\n return (\n <I18nProvider>\n {result === null && (\n <Widget\n recording={recording}\n elapsedMs={elapsedMs}\n onToggle={onToggle}\n position={position}\n />\n )}\n {result !== null && (\n <Panel result={result} position={position} onClose={onClose} resolveFrame={resolveFrame} />\n )}\n </I18nProvider>\n )\n}\n","import { h, createContext, type ComponentChildren } from 'preact'\nimport { useContext, useState, useCallback, useMemo } from 'preact/hooks'\nimport type { SignalKind, HeapTrendClass } from '@react-perfscope/core'\n\nexport type Lang = 'en' | 'ko'\n\nexport const STORAGE_KEY = 'react-perfscope-lang'\n\n// Signal-kind *identifiers* (forced-reflow, layout-shift, …) stay as-is in\n// data attributes and internal logic, but their *display* labels go through\n// `kindLabel`. Web-vital metric names (LCP, INP, …) and units (ms, KB) are\n// never translated — they are standard web-perf terms.\nexport interface Strings {\n save: string\n saveAria: string\n saveTitle: string\n closeAria: string\n noSignals: string\n sort: string\n sortChronological: string\n sortSeverity: string\n filterPlaceholder: string\n filterAria: string\n filterNoMatches: string\n groupBy: string\n groupChronological: string\n groupComponent: string\n groupSource: string\n groupCommit: string\n timeline: string\n // detail labels\n value: string\n started: string\n duration: string\n size: string\n bytes: string\n renderBlocking: string\n metric: string\n component: string\n reason: string\n at: string\n ended: string\n yes: string\n no: string\n rect: string\n noSourceRects: string\n noStack: string\n resolvingSourceMaps: string\n anonymous: string\n blocking: string\n sourceCount: (n: number) => string\n moreItems: (n: number) => string\n /** Badge on a coalesced forced-reflow showing how many reads it merged. */\n coalescedReads: (n: number) => string\n /** Badge on a commit render showing how many components re-rendered. */\n cascadeComponents: (n: number) => string\n // widget\n startRecording: string\n stopRecording: string\n rec: string\n // summary\n signalsTitle: (n: number, kind: string) => string\n // timeline\n noTimeBound: string\n timeAxis: string\n // heap\n heapLabel: string\n heapUnsupported: string\n heapExtensionHint: string\n heapTrendLabel: (cls: HeapTrendClass) => string\n // frame rate\n fpsLabel: string\n fpsUnsupported: string\n fpsBadge: (minFps: number, dropped: number) => string\n fpsWorst: (ms: number) => string\n // render insights\n topRenderers: string\n moreComponents: (n: number) => string\n rendererDetail: (component: string, count: number, totalMs: number, maxMs: number) => string\n // aria / tooltips\n language: string\n panelRegion: string\n ratingLabel: (rating: string) => string\n severityLabel: (sev: string) => string\n worstLabel: (sev: string) => string\n // signal-kind display label (identifier stays in data attrs / logic)\n kindLabel: (kind: SignalKind) => string\n // render reasons\n reasonMounted: string\n reasonState: string\n reasonProps: string\n reasonParent: string\n cascadeRoot: string\n changedProps: string\n unnecessaryRenders: (n: number) => string\n // long-task scripts\n scripts: string\n invoker: string\n source: string\n blockingTime: string\n noScripts: string\n hotFunctions: string\n hotFunctionsHint: string\n // interaction (INP)\n interactionEvent: string\n inputDelay: string\n processingTime: string\n presentation: string\n interactionThresholdHint: string\n // layout-shift\n layoutShiftHint: string\n}\n\nconst en: Strings = {\n save: 'Save',\n saveAria: 'Save recording',\n saveTitle: 'Save recording as JSON',\n closeAria: 'Close panel',\n noSignals: 'No signals recorded.',\n sort: 'Sort',\n sortChronological: 'chronological',\n sortSeverity: 'severity (worst first)',\n filterPlaceholder: 'Filter…',\n filterAria: 'Filter signals',\n filterNoMatches: 'No signals match the filter.',\n groupBy: 'Group by',\n groupChronological: 'chronological',\n groupComponent: 'component',\n groupSource: 'source',\n groupCommit: 'cascade (commit)',\n timeline: 'timeline',\n value: 'value',\n started: 'started',\n duration: 'duration',\n size: 'size',\n bytes: 'bytes',\n renderBlocking: 'render-blocking',\n metric: 'metric',\n component: 'component',\n reason: 'reason',\n at: 'at',\n ended: 'ended',\n yes: 'yes',\n no: 'no',\n rect: 'rect',\n noSourceRects: 'No source rects.',\n noStack: 'No stack captured.',\n resolvingSourceMaps: 'resolving source maps…',\n anonymous: '(anonymous)',\n blocking: 'blocking',\n sourceCount: (n) => `${n} source(s)`,\n moreItems: (n) => `+ ${n} more`,\n coalescedReads: (n) => `${n} reads`,\n cascadeComponents: (n) => `${n} components`,\n startRecording: 'Start recording',\n stopRecording: 'Stop recording',\n rec: 'rec',\n signalsTitle: (n, kind) => `${n} ${kind} signals`,\n noTimeBound: 'No time-bound signals to plot.',\n timeAxis: 'time',\n heapLabel: 'heap',\n heapUnsupported: 'heap size unavailable (Chromium only)',\n heapExtensionHint:\n 'Heap size includes browser extensions injected into the page (e.g. React DevTools), so it can rise even while your app is idle. For app-only measurement, record in an incognito window or a profile with extensions disabled.',\n heapTrendLabel: (cls) =>\n cls === 'leak-suspected' ? 'leak suspected' : cls === 'growing' ? 'growing' : 'stable',\n fpsLabel: 'fps',\n fpsUnsupported: 'frame timing unavailable',\n fpsBadge: (minFps, dropped) => `min ${minFps}fps · ${dropped} dropped`,\n fpsWorst: (ms) => `worst ${ms}ms`,\n topRenderers: 'Top renderers · by total time',\n moreComponents: (n) => `+ ${n} more component${n === 1 ? '' : 's'}`,\n rendererDetail: (c, n, total, max) =>\n `${c} · ${n} renders · total ${total.toFixed(1)}ms · max ${max.toFixed(1)}ms`,\n language: 'Language',\n panelRegion: 'react-perfscope panel',\n ratingLabel: (rating) => `rating: ${rating}`,\n severityLabel: (sev) => `severity: ${sev}`,\n worstLabel: (sev) => `worst: ${sev}`,\n kindLabel: (kind) => kind,\n reasonMounted: 'mounted',\n reasonState: 'state changed',\n reasonProps: 'props changed',\n reasonParent: 'parent re-rendered',\n cascadeRoot: 'root',\n changedProps: 'changed',\n unnecessaryRenders: (n) => `${n} unnecessary render${n === 1 ? '' : 's'} (parent-driven)`,\n scripts: 'scripts',\n invoker: 'invoker',\n source: 'source',\n blockingTime: 'blocking',\n noScripts: 'No script attribution (LoAF unsupported).',\n hotFunctions: 'your hot functions',\n hotFunctionsHint: 'sampled time spent in your own source',\n interactionEvent: 'event',\n inputDelay: 'input delay',\n processingTime: 'processing',\n presentation: 'presentation',\n interactionThresholdHint: 'Only interactions ≥40ms are shown — INP surfaces the slow ones; fast clicks are omitted.',\n layoutShiftHint: 'Every layout shift, including ones triggered by your interactions. The CLS metric excludes input-driven shifts, so this is not a CLS score.',\n}\n\nconst KIND_LABELS_KO: Record<SignalKind, string> = {\n render: '렌더',\n 'layout-shift': '레이아웃 이동',\n 'long-task': '긴 작업',\n 'forced-reflow': '강제 리플로우',\n network: '네트워크',\n interaction: '상호작용',\n 'web-vital': '웹 바이탈',\n}\n\nconst ko: Strings = {\n save: '저장',\n saveAria: '녹화 저장',\n saveTitle: '녹화를 JSON으로 저장',\n closeAria: '패널 닫기',\n noSignals: '녹화된 시그널이 없어요.',\n sort: '정렬',\n sortChronological: '시간순',\n sortSeverity: '심각도순 (높은 것부터)',\n filterPlaceholder: '필터…',\n filterAria: '시그널 필터',\n filterNoMatches: '필터와 일치하는 시그널이 없어요.',\n groupBy: '그룹화',\n groupChronological: '시간순',\n groupComponent: '컴포넌트',\n groupSource: '소스',\n groupCommit: '연쇄 (커밋)',\n timeline: '타임라인',\n value: '값',\n started: '시작',\n duration: '지속시간',\n size: '크기',\n bytes: '바이트',\n renderBlocking: '렌더 차단',\n metric: '지표',\n component: '컴포넌트',\n reason: '원인',\n at: '시점',\n ended: '종료',\n yes: '예',\n no: '아니오',\n rect: '영역',\n noSourceRects: '소스 영역이 없어요.',\n noStack: '캡처된 스택이 없어요.',\n resolvingSourceMaps: '소스맵 해석 중…',\n anonymous: '(익명)',\n blocking: '차단',\n sourceCount: (n) => `소스 ${n}개`,\n moreItems: (n) => `외 ${n}개 더`,\n coalescedReads: (n) => `읽기 ${n}회`,\n cascadeComponents: (n) => `컴포넌트 ${n}개`,\n startRecording: '녹화 시작',\n stopRecording: '녹화 종료',\n rec: '녹화',\n signalsTitle: (n, kind) => `${kind} 시그널 ${n}개`,\n noTimeBound: '표시할 시간 기반 시그널이 없어요.',\n timeAxis: '시간',\n heapLabel: '힙',\n heapUnsupported: '힙 측정 미지원 (크롬 전용)',\n heapExtensionHint:\n '힙 크기엔 페이지에 주입된 브라우저 확장(예: React DevTools) 메모리도 포함돼요. 그래서 앱이 idle이어도 올라갈 수 있어요. 앱만 정확히 재려면 시크릿 창이나 확장이 꺼진 프로필에서 녹화하세요.',\n heapTrendLabel: (cls) =>\n cls === 'leak-suspected' ? '누수 의심' : cls === 'growing' ? '증가 중' : '안정',\n fpsLabel: 'fps',\n fpsUnsupported: '프레임 측정 미지원',\n fpsBadge: (minFps, dropped) => `최저 ${minFps}fps · 드랍 ${dropped}`,\n fpsWorst: (ms) => `최악 ${ms}ms`,\n topRenderers: '상위 렌더러 · 총 시간순',\n moreComponents: (n) => `외 컴포넌트 ${n}개 더`,\n rendererDetail: (c, n, total, max) =>\n `${c} · 렌더 ${n}회 · 총 ${total.toFixed(1)}ms · 최대 ${max.toFixed(1)}ms`,\n language: '언어',\n panelRegion: 'react-perfscope 패널',\n ratingLabel: (rating) => `평가: ${rating}`,\n severityLabel: (sev) => `심각도: ${sev}`,\n worstLabel: (sev) => `가장 심각: ${sev}`,\n kindLabel: (kind) => KIND_LABELS_KO[kind],\n reasonMounted: '마운트됨',\n reasonState: 'state 변경',\n reasonProps: 'props 변경',\n reasonParent: '부모 따라 리렌더',\n cascadeRoot: '시작점',\n changedProps: '변경된 props',\n unnecessaryRenders: (n) => `불필요한 리렌더 ${n}개 (부모 때문에)`,\n scripts: '스크립트',\n invoker: '호출자',\n source: '소스',\n blockingTime: '차단 시간',\n noScripts: '스크립트 출처 없음 (LoAF 미지원).',\n hotFunctions: '내 코드 핫스팟',\n hotFunctionsHint: '내 소스에서 샘플링된 점유 시간',\n interactionEvent: '이벤트',\n inputDelay: '입력 지연',\n processingTime: '처리',\n presentation: '화면 반영',\n interactionThresholdHint: '40ms 이상 걸린 상호작용만 표시돼요 — 느린 것만 INP로 잡고, 빠른 클릭은 생략해요.',\n layoutShiftHint: '사용자 인터랙션으로 생긴 것까지 포함한 모든 레이아웃 시프트예요. CLS 지표는 입력으로 인한 시프트를 제외하므로, 이건 CLS 점수가 아니에요.',\n}\n\nexport const STRINGS: Record<Lang, Strings> = { en, ko }\n\nfunction isLang(v: unknown): v is Lang {\n return v === 'en' || v === 'ko'\n}\n\nexport function readStoredLang(): Lang {\n if (typeof localStorage === 'undefined') return 'en'\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n return isLang(v) ? v : 'en'\n } catch {\n return 'en'\n }\n}\n\nexport interface I18nValue {\n lang: Lang\n setLang: (lang: Lang) => void\n t: Strings\n}\n\n// Default value: English with a no-op setter. Lets components render outside a\n// provider (e.g. unit tests) and default to English without crashing.\nconst I18nContext = createContext<I18nValue>({\n lang: 'en',\n setLang: () => {},\n t: en,\n})\n\nexport function I18nProvider({ children }: { children: ComponentChildren }) {\n const [lang, setLangState] = useState<Lang>(() => readStoredLang())\n const setLang = useCallback((l: Lang) => {\n setLangState(l)\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(STORAGE_KEY, l)\n } catch {\n // ignore persistence failures (private mode, quota, etc.)\n }\n }\n }, [])\n const value = useMemo<I18nValue>(() => ({ lang, setLang, t: STRINGS[lang] }), [lang, setLang])\n return h(I18nContext.Provider, { value }, children)\n}\n\nexport function useI18n(): I18nValue {\n return useContext(I18nContext)\n}\n","import { h } from 'preact'\nimport type { WidgetPosition } from './types'\nimport { useI18n } from './i18n'\n\nexport interface WidgetProps {\n recording: boolean\n elapsedMs?: number\n onToggle: () => void\n position?: WidgetPosition\n}\n\nconst POSITION_STYLES: Record<WidgetPosition, Record<string, string>> = {\n 'bottom-right': { bottom: '16px', right: '16px' },\n 'bottom-left': { bottom: '16px', left: '16px' },\n 'top-right': { top: '16px', right: '16px' },\n 'top-left': { top: '16px', left: '16px' },\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000)\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds - minutes * 60\n return `${minutes}:${seconds.toString().padStart(2, '0')}`\n}\n\nexport function Widget(props: WidgetProps) {\n const { recording, elapsedMs = 0, onToggle, position = 'bottom-right' } = props\n const positionStyle = POSITION_STYLES[position]\n const { t } = useI18n()\n\n return (\n <div\n data-position={position}\n style={{\n position: 'fixed',\n ...positionStyle,\n zIndex: '2147483647',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }}\n >\n <button\n type=\"button\"\n aria-pressed={recording}\n aria-label={recording ? t.stopRecording : t.startRecording}\n onClick={onToggle}\n style={{\n background: '#1a1a1a',\n color: '#e6e6e6',\n border: '1px solid #2a2a2a',\n borderRadius: '20px',\n padding: '8px 14px',\n fontSize: '12px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.2)',\n }}\n >\n <span\n style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: recording ? '#ff3b30' : '#666',\n display: 'inline-block',\n }}\n />\n <span aria-live=\"polite\">\n {recording ? formatElapsed(elapsedMs) : t.rec}\n </span>\n </button>\n </div>\n )\n}\n","import { h } from 'preact'\nimport { useState, useMemo, useEffect, useRef } from 'preact/hooks'\nimport type {\n RecordingResult,\n Signal,\n SignalKind,\n ForcedReflowSignal,\n LayoutShiftSignal,\n LongTaskSignal,\n LongTaskAttribution,\n NetworkSignal,\n RenderSignal,\n InteractionSignal,\n RenderReason,\n WebVitalSignal,\n StackFrame,\n} from '@react-perfscope/core'\nimport type { WidgetPosition } from './types'\nimport { showOverlay, hideOverlay, hideAllOverlays, showArrow, hideArrow } from './overlay'\nimport {\n severityForSignal,\n worstSeverity,\n webVitalRating,\n SEVERITY_COLOR,\n SEVERITY_OVERLAY_COLOR,\n RATING_COLOR,\n severityRank,\n type Severity,\n type Rating,\n} from './severity'\nimport { SummaryHeader } from './summary'\nimport { Timeline } from './timeline'\nimport { RenderInsights } from './render-insights'\nimport { InpEpisode } from './inp-episode'\nimport { LongTaskEpisode } from './long-task-episode'\nimport { signalMatchesFilter } from './filter'\nimport { useI18n, type Lang, type Strings } from './i18n'\n\n// Render-reason colors. `parent` is amber because it's the avoidable case —\n// the component re-rendered only because its parent did, with no prop change.\n// `state` is green: it's the intentional root of the cascade. `mount`/`props`\n// are neutral/informational.\nconst RENDER_REASON_COLOR: Record<RenderReason, string> = {\n mount: '#5ac8fa',\n state: '#34c759',\n props: '#8e8e93',\n parent: '#ff9500',\n}\n\nfunction renderReasonLabel(t: Strings, reason: RenderReason): string {\n switch (reason) {\n case 'mount': return t.reasonMounted\n case 'state': return t.reasonState\n case 'props': return t.reasonProps\n case 'parent': return t.reasonParent\n }\n}\n\nfunction RenderReasonTag({ reason, changedProps }: { reason: RenderReason; changedProps?: string[] }) {\n const { t } = useI18n()\n const color = RENDER_REASON_COLOR[reason]\n const label = renderReasonLabel(t, reason)\n const keys = reason === 'props' && changedProps && changedProps.length > 0 ? `: ${changedProps.join(', ')}` : ''\n return (\n <span\n style={{\n color,\n border: `1px solid ${color}`,\n borderRadius: '4px',\n padding: '0 5px',\n fontSize: '10px',\n fontWeight: 600,\n whiteSpace: 'nowrap',\n }}\n >\n {label}{keys}\n </span>\n )\n}\n\nexport interface PanelProps {\n result: RecordingResult\n position?: WidgetPosition\n onClose: () => void\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}\n\nconst KIND_ORDER: SignalKind[] = [\n 'forced-reflow',\n 'layout-shift',\n 'long-task',\n 'interaction',\n 'network',\n 'web-vital',\n 'render',\n]\n\nconst POSITION_STYLES: Record<WidgetPosition, Record<string, string>> = {\n 'bottom-right': { bottom: '16px', right: '16px' },\n 'bottom-left': { bottom: '16px', left: '16px' },\n 'top-right': { top: '16px', right: '16px' },\n 'top-left': { top: '16px', left: '16px' },\n}\n\nfunction groupByKind(signals: Signal[]): Record<SignalKind, Signal[]> {\n const acc = {\n 'forced-reflow': [] as Signal[],\n 'layout-shift': [] as Signal[],\n 'long-task': [] as Signal[],\n 'interaction': [] as Signal[],\n 'network': [] as Signal[],\n 'web-vital': [] as Signal[],\n 'render': [] as Signal[],\n } as Record<SignalKind, Signal[]>\n for (const s of signals) acc[s.kind].push(s)\n return acc\n}\n\nconst WEB_VITAL_UNIT: Record<WebVitalSignal['name'], string> = {\n LCP: 'ms',\n INP: 'ms',\n CLS: '',\n FCP: 'ms',\n TTFB: 'ms',\n}\n\nfunction RatingDot({ rating }: { rating: Rating }) {\n const { t } = useI18n()\n return (\n <span\n data-rating={rating}\n aria-label={t.ratingLabel(rating)}\n style={{\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: RATING_COLOR[rating],\n marginRight: '6px',\n verticalAlign: 'middle',\n }}\n />\n )\n}\n\nfunction hexToRgba(hex: string, alpha: number): string {\n // Accepts #rrggbb only. Returns rgba(...) with the requested alpha.\n const m = /^#([0-9a-f]{6})$/i.exec(hex)\n if (!m) return hex\n const v = m[1]!\n const r = parseInt(v.slice(0, 2), 16)\n const g = parseInt(v.slice(2, 4), 16)\n const b = parseInt(v.slice(4, 6), 16)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\nfunction formatCls(value: number): string {\n if (value === 0) return '0'\n if (value < 0.001) return value.toExponential(2)\n if (value < 0.01) return value.toFixed(4)\n return value.toFixed(3)\n}\n\nfunction summary(s: Signal): string {\n switch (s.kind) {\n case 'forced-reflow':\n return `@ ${s.at.toFixed(1)}ms • duration ${s.duration.toFixed(2)}ms`\n case 'layout-shift':\n return `@ ${s.at.toFixed(1)}ms • value ${formatCls(s.value)} • ${s.sources.length} source(s)`\n case 'long-task':\n return `@ ${s.at.toFixed(1)}ms • duration ${s.duration.toFixed(1)}ms`\n case 'interaction':\n return `${s.eventType}${s.target ? ` ${s.target}` : ''} • ${s.duration.toFixed(0)}ms`\n case 'network':\n return `${s.url.length > 60 ? s.url.slice(0, 57) + '...' : s.url} • ${s.duration.toFixed(0)}ms${s.blocking ? ' • blocking' : ''}`\n case 'web-vital':\n return `${s.name}: ${s.value.toFixed(2)}`\n case 'render':\n return `${s.component} • ${s.reason} • ${s.duration.toFixed(2)}ms${s.count && s.count > 1 ? ` • ${s.count} components` : ''}`\n }\n}\n\nconst detailLabelStyle = { color: '#888', marginRight: '6px' } as const\nconst detailRowStyle = { padding: '2px 0', display: 'flex', gap: '6px' } as const\nconst monoStyle = {\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n} as const\n\nfunction LayoutShiftDetail({ s }: { s: LayoutShiftSignal }) {\n const { t } = useI18n()\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.value}</span><span>{s.value.toFixed(4)}</span></div>\n {s.sources.length === 0 ? (\n <div style={{ color: '#666' }}>{t.noSourceRects}</div>\n ) : (\n s.sources.map((r, i) => (\n <div key={i} style={{ ...detailRowStyle, ...monoStyle }}>\n <span style={{ color: '#888' }}>{t.rect} {i + 1}</span>\n <span>x={r.x.toFixed(0)} y={r.y.toFixed(0)} w={r.width.toFixed(0)} h={r.height.toFixed(0)}</span>\n </div>\n ))\n )}\n </div>\n )\n}\n\nfunction NetworkDetail({ s }: { s: NetworkSignal }) {\n const { t } = useI18n()\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={{ ...detailRowStyle, ...monoStyle, wordBreak: 'break-all' as const }}>\n <span>{s.url}</span>\n </div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.started}</span><span>{s.startedAt.toFixed(0)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(0)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.size}</span><span>{(s.size / 1024).toFixed(2)}KB ({s.size} {t.bytes})</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.renderBlocking}</span><span>{s.blocking ? t.yes : t.no}</span></div>\n </div>\n )\n}\n\nfunction WebVitalDetail({ s }: { s: WebVitalSignal }) {\n const { t } = useI18n()\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.metric}</span><span>{s.name}</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.value}</span><span>{s.value.toFixed(2)}</span></div>\n </div>\n )\n}\n\nfunction RenderDetail({ s }: { s: RenderSignal }) {\n const { t } = useI18n()\n // Commit signal (carries members): show the whole cascade.\n if (s.members && s.members.length > 0) {\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(3)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.at}</span><span>{s.at.toFixed(2)}ms</span></div>\n <div style={{ marginTop: '6px' }}><CascadeMembers members={s.members} /></div>\n </div>\n )\n }\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.component}</span><span>{s.component}</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.reason}</span><RenderReasonTag reason={s.reason} changedProps={s.changedProps} /></div>\n {s.reason === 'props' && s.changedProps && s.changedProps.length > 0 && (\n <div style={{ ...detailRowStyle, ...monoStyle }}><span style={detailLabelStyle}>{t.changedProps}</span><span>{s.changedProps.join(', ')}</span></div>\n )}\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(3)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.at}</span><span>{s.at.toFixed(2)}ms</span></div>\n </div>\n )\n}\n\nfunction StackFrames({\n raw,\n resolveFrame,\n limit = 8,\n}: {\n raw: StackFrame[]\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n limit?: number\n}) {\n const { t } = useI18n()\n const original = raw.slice(0, limit)\n const [frames, setFrames] = useState<StackFrame[]>(original)\n const [resolving, setResolving] = useState(false)\n\n useEffect(() => {\n if (!resolveFrame || original.length === 0) return\n let cancelled = false\n setResolving(true)\n Promise.all(original.map((f) => resolveFrame(f)))\n .then((resolved) => {\n if (!cancelled) setFrames(resolved)\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setResolving(false)\n })\n return () => {\n cancelled = true\n }\n }, [raw])\n\n return (\n <>\n {resolving && (\n <div style={{ color: '#666', fontSize: '10px', marginBottom: '4px' }}>\n {t.resolvingSourceMaps}\n </div>\n )}\n {frames.length === 0 ? (\n <div style={{ color: '#666' }}>{t.noStack}</div>\n ) : (\n frames.map((f, i) => (\n <div key={i} style={{ ...detailRowStyle, ...monoStyle }}>\n {f.fnName ? <span>{f.fnName}</span> : <span style={{ color: '#666' }}>{t.anonymous}</span>}\n <span style={{ color: '#888' }}>{f.file}:{f.line}:{f.col}</span>\n </div>\n ))\n )}\n </>\n )\n}\n\nfunction ForcedReflowDetail({\n s,\n resolveFrame,\n}: {\n s: ForcedReflowSignal\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n return (\n <div style={{ paddingLeft: '12px' }}>\n <StackFrames raw={s.stack} resolveFrame={resolveFrame} />\n </div>\n )\n}\n\nfunction HotFunctions({\n attribution,\n resolveFrame,\n}: {\n attribution: LongTaskAttribution[]\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n const { t } = useI18n()\n const [frames, setFrames] = useState<StackFrame[]>(attribution.map((a) => a.frame))\n\n useEffect(() => {\n if (!resolveFrame) return\n let cancelled = false\n Promise.all(attribution.map((a) => resolveFrame(a.frame)))\n .then((resolved) => {\n if (!cancelled) setFrames(resolved)\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [attribution])\n\n return (\n <div style={{ marginTop: '6px' }}>\n <div style={{ ...detailLabelStyle, textTransform: 'uppercase', fontSize: '10px', letterSpacing: '0.5px', marginBottom: '1px', color: '#ff9f0a' }}>{t.hotFunctions}</div>\n <div style={{ color: '#666', fontSize: '10px', marginBottom: '4px' }}>{t.hotFunctionsHint}</div>\n {attribution.map((a, i) => {\n const f = frames[i] ?? a.frame\n const pct = Math.round(a.selfRatio * 100)\n return (\n <div key={i} style={{ ...monoStyle, padding: '3px 0', borderTop: i > 0 ? '1px dashed #1f1f1f' : 'none' }}>\n <div>\n <span style={{ color: '#ff9f0a', fontWeight: 600 }}>{f.fnName || <span style={{ color: '#666' }}>{t.anonymous}</span>}</span>\n <span style={{ color: SEVERITY_COLOR.medium, marginLeft: '6px' }}>{pct}%</span>\n <span style={{ color: '#666', marginLeft: '6px' }}>({a.sampleCount})</span>\n </div>\n <div style={{ color: '#888', wordBreak: 'break-all' as const }}>{f.file}:{f.line}:{f.col}</div>\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction LongTaskDetail({\n s,\n resolveFrame,\n}: {\n s: LongTaskSignal\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n const { t } = useI18n()\n const scripts = s.scripts ? [...s.scripts].sort((a, b) => b.duration - a.duration) : []\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.started}</span><span>{s.at.toFixed(2)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.ended}</span><span>{(s.at + s.duration).toFixed(2)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(2)}ms</span></div>\n {typeof s.blockingDuration === 'number' && (\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.blockingTime}</span><span>{s.blockingDuration.toFixed(2)}ms</span></div>\n )}\n {s.attribution !== undefined && s.attribution.length > 0 && (\n <HotFunctions attribution={s.attribution} resolveFrame={resolveFrame} />\n )}\n {s.scripts !== undefined && (\n <div style={{ marginTop: '6px' }}>\n <div style={{ ...detailLabelStyle, textTransform: 'uppercase', fontSize: '10px', letterSpacing: '0.5px', marginBottom: '4px' }}>{t.scripts}</div>\n {scripts.length === 0 ? (\n <div style={{ color: '#666' }}>{t.noScripts}</div>\n ) : (\n scripts.map((script, i) => (\n <div key={i} style={{ ...monoStyle, padding: '3px 0', borderTop: i > 0 ? '1px dashed #1f1f1f' : 'none' }}>\n <div>\n <span>{script.sourceFunctionName || <span style={{ color: '#666' }}>{t.anonymous}</span>}</span>\n <span style={{ color: '#5ac8fa', marginLeft: '6px' }}>{script.invokerType}</span>\n <span style={{ color: SEVERITY_COLOR.medium, marginLeft: '6px' }}>{script.duration.toFixed(1)}ms</span>\n </div>\n {script.sourceURL && (\n <div style={{ color: '#888', wordBreak: 'break-all' as const }}>\n {script.sourceURL}{script.charPosition >= 0 ? `@${script.charPosition}` : ''}\n </div>\n )}\n {script.invoker && <div style={{ color: '#666' }}>{t.invoker}: {script.invoker}</div>}\n </div>\n ))\n )}\n </div>\n )}\n {s.scripts === undefined && s.stack.length > 0 && (\n <div style={{ marginTop: '4px' }}>\n <StackFrames raw={s.stack} resolveFrame={resolveFrame} limit={5} />\n </div>\n )}\n </div>\n )\n}\n\nconst INTERACTION_PHASE_COLOR = { input: '#8e8e93', processing: '#5ac8fa', presentation: '#34c759' }\n\nfunction InteractionDetail({\n s,\n resolveFrame,\n}: {\n s: InteractionSignal\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n const { t } = useI18n()\n const total = Math.max(s.duration, 1)\n const phases: { label: string; ms: number; color: string }[] = [\n { label: t.inputDelay, ms: s.inputDelay, color: INTERACTION_PHASE_COLOR.input },\n { label: t.processingTime, ms: s.processing, color: INTERACTION_PHASE_COLOR.processing },\n { label: t.presentation, ms: s.presentation, color: INTERACTION_PHASE_COLOR.presentation },\n ]\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.interactionEvent}</span><span>{s.eventType}{s.target ? ` · ${s.target}` : ''}</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(0)}ms</span></div>\n <div style={{ display: 'flex', height: '10px', borderRadius: '3px', overflow: 'hidden', margin: '5px 0 7px', background: '#1a1a1a' }}>\n {phases.map((p, i) => (\n <div key={i} style={{ width: `${(p.ms / total) * 100}%`, background: p.color }} />\n ))}\n </div>\n {phases.map((p, i) => (\n <div key={i} style={detailRowStyle}>\n <span style={{ ...detailLabelStyle, display: 'inline-flex', alignItems: 'center', gap: '5px' }}>\n <span style={{ width: '7px', height: '7px', borderRadius: '2px', background: p.color, flex: '0 0 7px' }} />\n {p.label}\n </span>\n <span>{p.ms.toFixed(0)}ms</span>\n </div>\n ))}\n {s.attribution !== undefined && s.attribution.length > 0 && (\n <HotFunctions attribution={s.attribution} resolveFrame={resolveFrame} />\n )}\n </div>\n )\n}\n\nfunction SignalDetail({\n s,\n resolveFrame,\n}: {\n s: Signal\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n switch (s.kind) {\n case 'forced-reflow': return <ForcedReflowDetail s={s} resolveFrame={resolveFrame} />\n case 'layout-shift': return <LayoutShiftDetail s={s} />\n case 'long-task': return <LongTaskDetail s={s} resolveFrame={resolveFrame} />\n case 'interaction': return <InteractionDetail s={s} resolveFrame={resolveFrame} />\n case 'network': return <NetworkDetail s={s} />\n case 'web-vital': return <WebVitalDetail s={s} />\n case 'render': return <RenderDetail s={s} />\n }\n}\n\nfunction SeverityDot({ sev, title }: { sev: Severity; title?: string }) {\n const { t } = useI18n()\n return (\n <span\n data-severity={sev}\n aria-label={t.severityLabel(sev)}\n title={title ?? sev}\n style={{\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: SEVERITY_COLOR[sev],\n flex: '0 0 8px',\n boxShadow: sev === 'high' ? '0 0 6px rgba(255,59,48,0.6)' : 'none',\n }}\n />\n )\n}\n\nfunction SummaryLine({ signal }: { signal: Signal }) {\n const { t } = useI18n()\n if (signal.kind === 'web-vital') {\n const rating = webVitalRating(signal.name, signal.value)\n const unit = WEB_VITAL_UNIT[signal.name]\n return (\n <span>\n <RatingDot rating={rating} />\n <strong>{signal.name}</strong>: {signal.value.toFixed(2)}{unit}\n </span>\n )\n }\n const sev = severityForSignal(signal)\n const color = SEVERITY_COLOR[sev]\n if (signal.kind === 'long-task') {\n return (\n <span>\n @ {signal.at.toFixed(1)}ms • duration{' '}\n <span style={{ color }}>{signal.duration.toFixed(1)}ms</span>\n </span>\n )\n }\n if (signal.kind === 'forced-reflow') {\n const count = signal.count ?? 1\n return (\n <span>\n @ {signal.at.toFixed(1)}ms • duration{' '}\n <span style={{ color }}>{signal.duration.toFixed(2)}ms</span>\n {count > 1 && (\n <span style={{ color: '#888' }}> • {t.coalescedReads(count)}</span>\n )}\n </span>\n )\n }\n if (signal.kind === 'layout-shift') {\n return (\n <span>\n @ {signal.at.toFixed(1)}ms • value{' '}\n <span style={{ color }}>{formatCls(signal.value)}</span>\n {' • '}{t.sourceCount(signal.sources.length)}\n </span>\n )\n }\n if (signal.kind === 'render') {\n return (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px' }}>\n <strong>{signal.component}</strong>\n <RenderReasonTag reason={signal.reason} changedProps={signal.changedProps} />\n <span style={{ color }}>{signal.duration.toFixed(2)}ms</span>\n {signal.count && signal.count > 1 && (\n <span style={{ color: '#888' }}>{t.cascadeComponents(signal.count)}</span>\n )}\n </span>\n )\n }\n if (signal.kind === 'network') {\n const url = signal.url.length > 60 ? signal.url.slice(0, 57) + '...' : signal.url\n return (\n <span>\n {url} • <span style={{ color }}>{signal.duration.toFixed(0)}ms</span>\n {signal.blocking && <span style={{ color: SEVERITY_COLOR.high }}> • {t.blocking}</span>}\n </span>\n )\n }\n return <span>{summary(signal)}</span>\n}\n\ntype GroupMode = 'chronological' | 'component' | 'source' | 'commit'\ntype SortMode = 'chronological' | 'severity'\n\nfunction tabSupportsGrouping(kind: SignalKind): boolean {\n return kind === 'render' || kind === 'forced-reflow'\n}\n\nfunction sortSignalsBySeverity(signals: Signal[]): Signal[] {\n return [...signals].sort((a, b) => {\n const ra = severityRank(severityForSignal(a))\n const rb = severityRank(severityForSignal(b))\n if (rb !== ra) return rb - ra\n return a.kind === 'web-vital' || b.kind === 'web-vital' ? 0 : (('at' in a ? a.at : 0) - ('at' in b ? b.at : 0))\n })\n}\n\ninterface SignalGroup {\n label: string\n count: number\n signals: Signal[]\n}\n\nfunction downloadRecording(result: RecordingResult): void {\n // Materialise lazy `stack` getters on forced-reflow and long-task signals\n // so JSON.stringify includes the parsed frames.\n const exportable = {\n ...result,\n signals: result.signals.map((s) => {\n if (s.kind === 'forced-reflow' || s.kind === 'long-task') {\n return { ...s, stack: s.stack }\n }\n return s\n }),\n }\n const json = JSON.stringify(exportable, null, 2)\n const blob = new Blob([json], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n try {\n const a = document.createElement('a')\n a.href = url\n a.download = `react-perfscope-${new Date().toISOString().replace(/[:.]/g, '-')}.json`\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n } finally {\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n }\n}\n\nfunction groupSignals(signals: Signal[], mode: GroupMode, kind: SignalKind): SignalGroup[] {\n if (mode === 'chronological') {\n return signals.map((s, i) => ({ label: `#${i + 1}`, count: 1, signals: [s] }))\n }\n if (mode === 'component' && kind === 'render') {\n const byName = new Map<string, Signal[]>()\n // Render signals are coalesced per commit; expand members back to\n // per-component rows for this view.\n for (const s of signals) {\n if (s.kind !== 'render') continue\n for (const m of s.members ?? [s]) {\n if (!byName.has(m.component)) byName.set(m.component, [])\n byName.get(m.component)!.push(m)\n }\n }\n return Array.from(byName.entries())\n .sort((a, b) => b[1].length - a[1].length)\n .map(([label, list]) => ({ label, count: list.length, signals: list }))\n }\n if (mode === 'commit' && kind === 'render') {\n // Each render signal already represents one commit.\n return signals\n .filter((s): s is RenderSignal => s.kind === 'render')\n .sort((a, b) => a.commitId - b.commitId)\n .map((s) => {\n const list = s.members ?? [s]\n return { label: s.component, count: list.length, signals: list }\n })\n }\n if (mode === 'source' && kind === 'forced-reflow') {\n const bySource = new Map<string, Signal[]>()\n for (const s of signals) {\n if (s.kind !== 'forced-reflow') continue\n const top = s.stack[0]\n const k = top ? `${top.file}:${top.line}:${top.col}` : '(no stack)'\n if (!bySource.has(k)) bySource.set(k, [])\n bySource.get(k)!.push(s)\n }\n return Array.from(bySource.entries())\n .sort((a, b) => b[1].length - a[1].length)\n .map(([label, list]) => ({ label, count: list.length, signals: list }))\n }\n return signals.map((s, i) => ({ label: `#${i + 1}`, count: 1, signals: [s] }))\n}\n\ninterface SignalRowProps {\n signal: Signal\n expanded: boolean\n onToggleExpand: () => void\n onHoverGeometry: (signal: LayoutShiftSignal | null) => void\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}\n\nfunction SignalRow({ signal, expanded, onToggleExpand, onHoverGeometry, resolveFrame }: SignalRowProps) {\n const hasGeometry = signal.kind === 'layout-shift' && signal.sources.length > 0\n const sev = severityForSignal(signal)\n return (\n <li\n aria-expanded={expanded}\n data-severity={sev}\n onClick={onToggleExpand}\n onMouseEnter={() => {\n if (hasGeometry && signal.kind === 'layout-shift') onHoverGeometry(signal)\n }}\n onMouseLeave={() => {\n if (hasGeometry) onHoverGeometry(null)\n }}\n style={{\n padding: '6px 8px',\n borderTop: '1px solid #1a1a1a',\n borderLeft: `3px solid ${sev === 'low' ? 'transparent' : SEVERITY_COLOR[sev]}`,\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n cursor: 'pointer',\n userSelect: 'none' as const,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <span style={{ color: '#888', width: '10px' }}>{expanded ? '▼' : '▶'}</span>\n <SeverityDot sev={sev} />\n <SummaryLine signal={signal} />\n </div>\n {expanded && (\n <div style={{ marginTop: '6px', paddingTop: '6px', borderTop: '1px dashed #2a2a2a' }}>\n <SignalDetail s={signal} resolveFrame={resolveFrame} />\n </div>\n )}\n </li>\n )\n}\n\nfunction CascadeMembers({ members }: { members: RenderSignal[] }) {\n const minDepth = members.reduce((m, s) => Math.min(m, s.depth), Infinity)\n return (\n <div>\n {members.map((m, i) => {\n const indent = (m.depth - minDepth) * 14\n const isCascade = m.reason === 'parent'\n return (\n <div\n key={i}\n style={{\n marginLeft: `${indent}px`,\n padding: '2px 0',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n <span style={{ color: isCascade ? RENDER_REASON_COLOR.parent : '#555' }}>\n {m.depth > minDepth ? '└' : '•'}\n </span>\n <strong>{m.component}</strong>\n <RenderReasonTag reason={m.reason} changedProps={m.changedProps} />\n <span style={{ color: '#888' }}>{m.duration.toFixed(2)}ms</span>\n </div>\n )\n })}\n </div>\n )\n}\n\ntype ActiveTab = SignalKind | 'timeline'\n\nfunction LanguageToggle() {\n const { lang, setLang, t } = useI18n()\n const langs: Lang[] = ['en', 'ko']\n const labels: Record<Lang, string> = { en: 'EN', ko: '한' }\n return (\n <div\n role=\"group\"\n aria-label={t.language}\n style={{\n display: 'inline-flex',\n border: '1px solid #2a2a2a',\n borderRadius: '4px',\n overflow: 'hidden',\n }}\n >\n {langs.map((l) => {\n const active = lang === l\n return (\n <button\n key={l}\n type=\"button\"\n aria-pressed={active}\n data-lang={l}\n onClick={() => setLang(l)}\n style={{\n background: active ? '#2a2a2a' : 'transparent',\n color: active ? '#e6e6e6' : '#888',\n border: 'none',\n cursor: 'pointer',\n fontSize: '11px',\n padding: '2px 8px',\n fontWeight: active ? 600 : 400,\n }}\n >\n {labels[l]}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport function Panel(props: PanelProps) {\n const { result, onClose, position = 'bottom-right', resolveFrame } = props\n const { t } = useI18n()\n const grouped = useMemo(() => groupByKind(result.signals), [result.signals])\n const kindsPresent = KIND_ORDER.filter((k) => grouped[k].length > 0)\n const hasTimelineSignals =\n result.signals.some((s) => s.kind !== 'web-vital') ||\n (result.heapSamples?.length ?? 0) > 0 ||\n (result.frames?.length ?? 0) > 0\n const [activeTab, setActiveTab] = useState<ActiveTab>(\n kindsPresent[0] ?? 'forced-reflow',\n )\n const activeKind: SignalKind | null = activeTab === 'timeline' ? null : activeTab\n const setActiveKind = (k: SignalKind) => setActiveTab(k)\n const [expandedKey, setExpandedKey] = useState<string | null>(null)\n const [groupMode, setGroupMode] = useState<Partial<Record<SignalKind, GroupMode>>>({})\n const [sortMode, setSortMode] = useState<Partial<Record<SignalKind, SortMode>>>({})\n const [filterText, setFilterText] = useState<Partial<Record<SignalKind, string>>>({})\n const activeOverlayCount = useRef(0)\n\n useEffect(() => () => hideAllOverlays(), [])\n\n function handleHover(signal: LayoutShiftSignal | null) {\n if (!signal) {\n for (let i = 0; i < activeOverlayCount.current; i++) {\n hideOverlay(`signal-${i}`)\n hideOverlay(`signal-prev-${i}`)\n hideArrow(`signal-arrow-${i}`)\n }\n activeOverlayCount.current = 0\n return\n }\n const sev = severityForSignal(signal)\n const color = SEVERITY_OVERLAY_COLOR[sev]\n const fillAlpha = sev === 'high' ? 0.2 : sev === 'medium' ? 0.16 : 0.14\n const fillRgba = hexToRgba(color, fillAlpha)\n signal.sources.forEach((r, i) => {\n // Skip sources with no current geometry — these typically represent\n // detached/removed nodes. Drawing an overlay (or worse, an arrow\n // pointing at 0,0) would be confusing noise.\n if (r.width <= 0 || r.height <= 0) return\n showOverlay(`signal-${i}`, r, { border: color, fill: fillRgba })\n const prev = signal.previousSources?.[i] ?? null\n if (prev && prev.width > 0 && prev.height > 0) {\n showOverlay(`signal-prev-${i}`, prev, {\n border: color,\n fill: 'transparent',\n dashed: true,\n })\n const from = { x: prev.x + prev.width / 2, y: prev.y + prev.height / 2 }\n const to = { x: r.x + r.width / 2, y: r.y + r.height / 2 }\n const dx = to.x - from.x\n const dy = to.y - from.y\n if (Math.hypot(dx, dy) > 8) {\n showArrow(`signal-arrow-${i}`, from, to, color)\n }\n }\n })\n activeOverlayCount.current = signal.sources.length\n }\n\n const panelStyle = {\n position: 'fixed' as const,\n ...POSITION_STYLES[position],\n width: '460px',\n maxHeight: '70vh',\n background: '#0d0d0d',\n color: '#e6e6e6',\n border: '1px solid #2a2a2a',\n borderRadius: '12px',\n padding: '12px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '12px',\n zIndex: '2147483647',\n boxShadow: '0 8px 32px rgba(0,0,0,0.4)',\n display: 'flex',\n flexDirection: 'column' as const,\n overflow: 'hidden',\n }\n\n return (\n <div role=\"region\" aria-label={t.panelRegion} style={panelStyle}>\n <header style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '8px' }}>\n <strong>react-perfscope</strong>\n <div style={{ display: 'flex', gap: '4px', alignItems: 'center' }}>\n <LanguageToggle />\n <button\n type=\"button\"\n aria-label={t.saveAria}\n onClick={() => downloadRecording(result)}\n title={t.saveTitle}\n style={{\n background: 'transparent',\n color: '#e6e6e6',\n border: '1px solid #2a2a2a',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '11px',\n padding: '2px 8px',\n }}\n >\n {t.save}\n </button>\n <button\n type=\"button\"\n aria-label={t.closeAria}\n onClick={onClose}\n style={{ background: 'transparent', color: '#e6e6e6', border: 'none', cursor: 'pointer', fontSize: '16px' }}\n >\n ×\n </button>\n </div>\n </header>\n\n {kindsPresent.length === 0 && (\n <div style={{ color: '#888' }}>{t.noSignals}</div>\n )}\n\n {kindsPresent.length > 0 && (\n <>\n <SummaryHeader\n signals={result.signals}\n grouped={grouped}\n kindsPresent={kindsPresent}\n onKindClick={(k) => { setActiveTab(k); setExpandedKey(null) }}\n />\n <nav style={{ display: 'flex', gap: '4px', flexWrap: 'wrap', marginBottom: '8px' }}>\n {hasTimelineSignals && (\n <button\n key=\"timeline\"\n type=\"button\"\n data-kind=\"timeline\"\n onClick={() => { setActiveTab('timeline'); setExpandedKey(null) }}\n style={{\n background: activeTab === 'timeline' ? '#2a2a2a' : '#1a1a1a',\n color: '#e6e6e6',\n border: '1px solid #2a2a2a',\n borderRadius: '6px',\n padding: '4px 8px',\n cursor: 'pointer',\n fontSize: '11px',\n }}\n >\n {t.timeline}\n </button>\n )}\n {kindsPresent.map((kind) => {\n const worst = worstSeverity(grouped[kind])\n const active = activeKind === kind\n return (\n <button\n key={kind}\n type=\"button\"\n data-kind={kind}\n data-worst-severity={worst}\n onClick={() => { setActiveTab(kind); setExpandedKey(null) }}\n style={{\n background: active ? '#2a2a2a' : '#1a1a1a',\n color: '#e6e6e6',\n border: `1px solid ${worst === 'low' ? '#2a2a2a' : SEVERITY_COLOR[worst]}`,\n borderRadius: '6px',\n padding: '4px 8px',\n cursor: 'pointer',\n fontSize: '11px',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n {worst !== 'low' && <SeverityDot sev={worst} title={t.worstLabel(worst)} />}\n {t.kindLabel(kind)} {grouped[kind].length}\n </button>\n )\n })}\n </nav>\n\n {activeKind && activeTab !== 'timeline' && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: '6px', fontSize: '11px', color: '#888', flexWrap: 'wrap' }}>\n <label style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {t.sort}\n <select\n aria-label={t.sort}\n value={sortMode[activeKind] ?? 'chronological'}\n onChange={(e) => {\n const v = (e.target as HTMLSelectElement).value as SortMode\n setSortMode({ ...sortMode, [activeKind]: v })\n setExpandedKey(null)\n }}\n style={{ background: '#1a1a1a', color: '#e6e6e6', border: '1px solid #2a2a2a', borderRadius: '4px', padding: '2px 6px', fontSize: '11px' }}\n >\n <option value=\"chronological\">{t.sortChronological}</option>\n <option value=\"severity\">{t.sortSeverity}</option>\n </select>\n </label>\n {tabSupportsGrouping(activeKind) && (\n <label style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {t.groupBy}\n <select\n aria-label={t.groupBy}\n value={groupMode[activeKind] ?? 'chronological'}\n onChange={(e) => {\n const v = (e.target as HTMLSelectElement).value as GroupMode\n setGroupMode({ ...groupMode, [activeKind]: v })\n setExpandedKey(null)\n }}\n style={{ background: '#1a1a1a', color: '#e6e6e6', border: '1px solid #2a2a2a', borderRadius: '4px', padding: '2px 6px', fontSize: '11px' }}\n >\n <option value=\"chronological\">{t.groupChronological}</option>\n {activeKind === 'render' && <option value=\"commit\">{t.groupCommit}</option>}\n {activeKind === 'render' && <option value=\"component\">{t.groupComponent}</option>}\n {activeKind === 'forced-reflow' && <option value=\"source\">{t.groupSource}</option>}\n </select>\n </label>\n )}\n <input\n type=\"text\"\n aria-label={t.filterAria}\n placeholder={t.filterPlaceholder}\n value={filterText[activeKind] ?? ''}\n onInput={(e) => {\n setFilterText({ ...filterText, [activeKind]: (e.target as HTMLInputElement).value })\n setExpandedKey(null)\n }}\n style={{ marginLeft: 'auto', background: '#1a1a1a', color: '#e6e6e6', border: '1px solid #2a2a2a', borderRadius: '4px', padding: '2px 6px', fontSize: '11px', width: '120px' }}\n />\n </div>\n )}\n\n {activeTab === 'timeline' && (\n <div style={{ flexGrow: 1, overflowY: 'auto', paddingTop: '4px', paddingBottom: '24px' }}>\n <Timeline\n signals={result.signals}\n duration={result.duration}\n startedAt={result.startedAt}\n heapSamples={result.heapSamples}\n frames={result.frames}\n onJump={(s) => {\n setActiveTab(s.kind)\n const inOrder = grouped[s.kind]\n const idx = inOrder.indexOf(s)\n if (idx >= 0) setExpandedKey(`${s.kind}-${idx}`)\n }}\n />\n </div>\n )}\n {activeKind === 'render' && activeTab !== 'timeline' && (\n <RenderInsights\n signals={grouped.render\n .flatMap((s) => (s.kind === 'render' ? s.members ?? [s] : []))\n .filter((s) => signalMatchesFilter(s, filterText.render ?? ''))}\n onSelect={() => {\n setGroupMode({ ...groupMode, render: 'component' })\n setExpandedKey(null)\n }}\n />\n )}\n {activeKind === 'long-task' && activeTab !== 'timeline' && (\n <LongTaskEpisode signals={result.signals} />\n )}\n {activeKind === 'layout-shift' && activeTab !== 'timeline' && (\n <div\n style={{\n padding: '6px 8px',\n marginBottom: '6px',\n fontSize: '11px',\n color: '#888',\n background: '#141414',\n border: '1px solid #1f1f1f',\n borderRadius: '6px',\n }}\n >\n {t.layoutShiftHint}\n </div>\n )}\n {activeKind === 'interaction' && activeTab !== 'timeline' && (\n <>\n <InpEpisode signals={result.signals} />\n <div\n style={{\n padding: '6px 8px',\n marginBottom: '6px',\n fontSize: '11px',\n color: '#888',\n background: '#141414',\n border: '1px solid #1f1f1f',\n borderRadius: '6px',\n }}\n >\n {t.interactionThresholdHint}\n </div>\n </>\n )}\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, overflowY: 'auto', flexGrow: 1, display: activeTab === 'timeline' ? 'none' : undefined }}>\n {activeKind && (() => {\n const filtered = grouped[activeKind].filter((s) =>\n signalMatchesFilter(s, filterText[activeKind] ?? ''),\n )\n const baseSignals = (sortMode[activeKind] ?? 'chronological') === 'severity'\n ? sortSignalsBySeverity(filtered)\n : filtered\n return groupSignals(baseSignals, groupMode[activeKind] ?? 'chronological', activeKind)\n })().map((g, gi) => {\n const currentMode = groupMode[activeKind] ?? 'chronological'\n if (currentMode === 'chronological') {\n const key = `${activeKind}-${gi}`\n return (\n <SignalRow\n key={key}\n signal={g.signals[0]!}\n expanded={expandedKey === key}\n onToggleExpand={() => setExpandedKey(expandedKey === key ? null : key)}\n onHoverGeometry={handleHover}\n resolveFrame={resolveFrame}\n />\n )\n }\n const key = `${activeKind}-group-${gi}`\n const isOpen = expandedKey === key\n const isCascade = activeKind === 'render' && currentMode === 'commit'\n const renderMembers = g.signals.filter((s): s is RenderSignal => s.kind === 'render')\n const unnecessary = isCascade ? renderMembers.filter((s) => s.reason === 'parent').length : 0\n return (\n <li\n key={key}\n aria-expanded={isOpen}\n onClick={() => setExpandedKey(isOpen ? null : key)}\n style={{\n padding: '6px 8px',\n borderTop: '1px solid #1a1a1a',\n borderLeft: unnecessary > 0 ? `3px solid ${RENDER_REASON_COLOR.parent}` : undefined,\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n cursor: 'pointer',\n userSelect: 'none' as const,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', flexWrap: 'wrap' }}>\n <span style={{ color: '#888', width: '10px' }}>{isOpen ? '▼' : '▶'}</span>\n <span><strong>{g.label}</strong> ×{g.count}</span>\n {isCascade && unnecessary > 0 && (\n <span style={{ color: RENDER_REASON_COLOR.parent, fontSize: '10px' }}>\n ⚠ {t.unnecessaryRenders(unnecessary)}\n </span>\n )}\n </div>\n {isOpen && (\n <div style={{ marginTop: '6px', paddingTop: '6px', borderTop: '1px dashed #2a2a2a', paddingLeft: '8px' }}>\n {isCascade ? (\n <CascadeMembers members={renderMembers} />\n ) : (\n <>\n {g.signals.slice(0, 20).map((s, si) => (\n <div key={si} style={{ padding: '2px 0' }}>\n <SummaryLine signal={s} />\n </div>\n ))}\n {g.signals.length > 20 && (\n <div style={{ color: '#888', marginTop: '4px' }}>{t.moreItems(g.signals.length - 20)}</div>\n )}\n </>\n )}\n </div>\n )}\n </li>\n )\n })}\n </ul>\n {activeKind &&\n activeTab !== 'timeline' &&\n (filterText[activeKind] ?? '').trim() !== '' &&\n grouped[activeKind].length > 0 &&\n grouped[activeKind].every((s) => !signalMatchesFilter(s, filterText[activeKind] ?? '')) && (\n <div style={{ padding: '12px 8px', fontSize: '11px', color: '#888' }}>\n {t.filterNoMatches}\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n","const OVERLAY_MARKER = 'data-perfscope-overlay'\nconst ARROW_MARKER = 'data-perfscope-overlay-arrow'\nconst FADE_MS = 80\n\nconst DEFAULT_BORDER = '#ff3b30'\nconst DEFAULT_FILL = 'rgba(255, 59, 48, 0.12)'\n\nexport interface OverlayStyle {\n /** Border color (CSS color). Defaults to red. */\n border?: string\n /** Background fill (CSS color). Defaults to translucent red. */\n fill?: string\n /** Optional dashed border for \"previous position\" overlays. */\n dashed?: boolean\n}\n\nfunction getOrCreate(id: string): HTMLElement {\n const existing = document.querySelector(`[${OVERLAY_MARKER}=\"${id}\"]`)\n if (existing) return existing as HTMLElement\n const el = document.createElement('div')\n el.setAttribute(OVERLAY_MARKER, id)\n // position:absolute (not fixed) so the highlight tracks the shifted\n // DOM position when the user scrolls. Coordinates passed to showOverlay\n // are document-relative (already adjusted by the layout-shift collector).\n el.style.position = 'absolute'\n el.style.pointerEvents = 'none'\n el.style.boxSizing = 'border-box'\n el.style.border = `2px solid ${DEFAULT_BORDER}`\n el.style.background = DEFAULT_FILL\n el.style.zIndex = '2147483646'\n el.style.borderRadius = '2px'\n el.style.transition = `opacity ${FADE_MS}ms ease-out`\n document.body.appendChild(el)\n return el\n}\n\nexport function showOverlay(id: string, rect: DOMRect, style?: OverlayStyle): void {\n const el = getOrCreate(id)\n el.style.left = `${rect.left}px`\n el.style.top = `${rect.top}px`\n el.style.width = `${rect.width}px`\n el.style.height = `${rect.height}px`\n el.style.opacity = '1'\n const border = style?.border ?? DEFAULT_BORDER\n const fill = style?.fill ?? DEFAULT_FILL\n el.style.borderStyle = style?.dashed ? 'dashed' : 'solid'\n el.style.borderColor = border\n el.style.background = fill\n}\n\n/**\n * Draws a translucent SVG arrow between two document-coord points.\n * Useful for visualising a layout-shift's previous → current position.\n * The arrow is appended to document.body as a single absolutely-positioned\n * SVG that spans the bounding box of the two points.\n */\nexport function showArrow(\n id: string,\n from: { x: number; y: number },\n to: { x: number; y: number },\n color: string = DEFAULT_BORDER,\n): void {\n // Reuse / replace existing arrow for this id\n let svg = document.querySelector(`[${ARROW_MARKER}=\"${id}\"]`) as SVGSVGElement | null\n if (!svg) {\n svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg') as SVGSVGElement\n svg.setAttribute(ARROW_MARKER, id)\n svg.style.position = 'absolute'\n svg.style.pointerEvents = 'none'\n svg.style.overflow = 'visible'\n svg.style.zIndex = '2147483646'\n svg.style.transition = `opacity ${FADE_MS}ms ease-out`\n document.body.appendChild(svg)\n }\n // Position the SVG at the bounding box, draw the arrow in local coords\n const minX = Math.min(from.x, to.x)\n const minY = Math.min(from.y, to.y)\n const w = Math.max(2, Math.abs(to.x - from.x))\n const h = Math.max(2, Math.abs(to.y - from.y))\n svg.style.left = `${minX}px`\n svg.style.top = `${minY}px`\n svg.setAttribute('width', `${w}`)\n svg.setAttribute('height', `${h}`)\n svg.setAttribute('viewBox', `0 0 ${w} ${h}`)\n svg.style.opacity = '1'\n\n while (svg.firstChild) svg.removeChild(svg.firstChild)\n\n const fx = from.x - minX\n const fy = from.y - minY\n const tx = to.x - minX\n const ty = to.y - minY\n\n const markerId = `perfscope-arrowhead-${id}`\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker')\n marker.setAttribute('id', markerId)\n marker.setAttribute('viewBox', '0 0 10 10')\n marker.setAttribute('refX', '8')\n marker.setAttribute('refY', '5')\n marker.setAttribute('markerWidth', '6')\n marker.setAttribute('markerHeight', '6')\n marker.setAttribute('orient', 'auto-start-reverse')\n const arrowPath = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n arrowPath.setAttribute('d', 'M 0 0 L 10 5 L 0 10 z')\n arrowPath.setAttribute('fill', color)\n marker.appendChild(arrowPath)\n defs.appendChild(marker)\n svg.appendChild(defs)\n\n const line = document.createElementNS('http://www.w3.org/2000/svg', 'line')\n line.setAttribute('x1', `${fx}`)\n line.setAttribute('y1', `${fy}`)\n line.setAttribute('x2', `${tx}`)\n line.setAttribute('y2', `${ty}`)\n line.setAttribute('stroke', color)\n line.setAttribute('stroke-width', '3')\n line.setAttribute('stroke-linecap', 'round')\n line.setAttribute('marker-end', `url(#${markerId})`)\n svg.appendChild(line)\n}\n\nexport function hideArrow(id: string): void {\n const svg = document.querySelector(`[${ARROW_MARKER}=\"${id}\"]`)\n if (svg) svg.remove()\n}\n\n/**\n * Trigger the fade-out transition and remove the overlay after it completes.\n * If the overlay is shown again before the fade timer fires, the timer is\n * cancelled and the element is kept.\n */\nexport function hideOverlay(id: string): void {\n const el = document.querySelector(`[${OVERLAY_MARKER}=\"${id}\"]`) as HTMLElement | null\n if (!el) return\n el.style.opacity = '0'\n setTimeout(() => {\n // Re-check existence in case the caller re-showed the overlay during the fade\n const stillThere = document.querySelector(`[${OVERLAY_MARKER}=\"${id}\"]`)\n if (stillThere && (stillThere as HTMLElement).style.opacity === '0') {\n stillThere.remove()\n }\n }, FADE_MS + 20)\n}\n\n/**\n * Remove every overlay immediately, skipping the fade. Used by Panel\n * unmount cleanup where we don't want lingering overlays.\n */\nexport function hideAllOverlays(): void {\n for (const el of Array.from(document.querySelectorAll(`[${OVERLAY_MARKER}]`))) {\n el.remove()\n }\n for (const el of Array.from(document.querySelectorAll(`[${ARROW_MARKER}]`))) {\n el.remove()\n }\n}\n","import type { Signal, SignalKind, WebVitalSignal } from '@react-perfscope/core'\n\nexport type Severity = 'low' | 'medium' | 'high'\nexport type Rating = 'good' | 'needs' | 'poor'\n\nexport const SEVERITY_COLOR: Record<Severity, string> = {\n low: '#666',\n medium: '#ff9500',\n high: '#ff3b30',\n}\n\n/**\n * Brighter palette used for overlays drawn on top of the page. The\n * row-/tab-level `SEVERITY_COLOR.low` (#666) is intentionally muted\n * for in-panel chrome, but on the live page that gray vanishes against\n * normal page contents. Overlays use saturated hues so the shifted\n * region is always visible, regardless of severity bucket.\n */\nexport const SEVERITY_OVERLAY_COLOR: Record<Severity, string> = {\n low: '#3b82f6',\n medium: '#ff9500',\n high: '#ff3b30',\n}\n\nexport const RATING_COLOR: Record<Rating, string> = {\n good: '#34c759',\n needs: '#ff9500',\n poor: '#ff3b30',\n}\n\nconst WEB_VITAL_THRESHOLDS: Record<WebVitalSignal['name'], [number, number]> = {\n LCP: [2500, 4000],\n INP: [200, 500],\n CLS: [0.1, 0.25],\n FCP: [1800, 3000],\n TTFB: [800, 1800],\n}\n\nexport function webVitalRating(name: WebVitalSignal['name'], value: number): Rating {\n const [good, needs] = WEB_VITAL_THRESHOLDS[name]\n if (value <= good) return 'good'\n if (value <= needs) return 'needs'\n return 'poor'\n}\n\nconst SEVERITY_RANK: Record<Severity, number> = { low: 0, medium: 1, high: 2 }\nconst RATING_RANK: Record<Rating, number> = { good: 0, needs: 1, poor: 2 }\n\nexport function severityForSignal(s: Signal): Severity {\n switch (s.kind) {\n case 'long-task':\n if (s.duration >= 100) return 'high'\n if (s.duration >= 50) return 'medium'\n return 'low'\n case 'forced-reflow':\n if (s.duration >= 20) return 'high'\n if (s.duration >= 5) return 'medium'\n return 'low'\n case 'layout-shift':\n if (s.value >= 0.1) return 'high'\n if (s.value >= 0.05) return 'medium'\n return 'low'\n case 'render':\n // 60fps frame budget = 16.6ms. >1 frame = medium, >2 = high.\n if (s.duration >= 33) return 'high'\n if (s.duration >= 16) return 'medium'\n return 'low'\n case 'network':\n if (s.blocking && s.duration >= 500) return 'high'\n if (s.duration >= 1000) return 'high'\n if (s.duration >= 500) return 'medium'\n return 'low'\n case 'web-vital': {\n const rating = webVitalRating(s.name, s.value)\n return rating === 'poor' ? 'high' : rating === 'needs' ? 'medium' : 'low'\n }\n case 'interaction':\n // Official INP thresholds: good < 200ms, needs-improvement < 500ms.\n if (s.duration >= 500) return 'high'\n if (s.duration >= 200) return 'medium'\n return 'low'\n }\n}\n\nexport function worstSeverity(signals: Signal[]): Severity {\n let worst: Severity = 'low'\n for (const s of signals) {\n const sev = severityForSignal(s)\n if (SEVERITY_RANK[sev] > SEVERITY_RANK[worst]) worst = sev\n }\n return worst\n}\n\nexport function severityRank(sev: Severity): number {\n return SEVERITY_RANK[sev]\n}\n\nexport function ratingRank(r: Rating): number {\n return RATING_RANK[r]\n}\n\nexport const KIND_LABEL: Record<SignalKind, string> = {\n 'forced-reflow': 'forced-reflow',\n 'layout-shift': 'layout-shift',\n 'long-task': 'long-task',\n 'interaction': 'interaction',\n 'network': 'network',\n 'web-vital': 'web-vital',\n 'render': 'render',\n}\n","import { h } from 'preact'\nimport type { Signal, SignalKind, WebVitalSignal } from '@react-perfscope/core'\nimport { SEVERITY_COLOR, RATING_COLOR, worstSeverity, webVitalRating } from './severity'\nimport { useI18n } from './i18n'\n\ninterface SummaryHeaderProps {\n signals: Signal[]\n grouped: Record<SignalKind, Signal[]>\n kindsPresent: SignalKind[]\n onKindClick?: (kind: SignalKind) => void\n}\n\nconst WEB_VITAL_UNIT: Record<WebVitalSignal['name'], string> = {\n LCP: 'ms',\n INP: 'ms',\n CLS: '',\n FCP: 'ms',\n TTFB: 'ms',\n}\n\nfunction formatVitalValue(name: WebVitalSignal['name'], value: number): string {\n if (name === 'CLS') return value.toFixed(3)\n if (value >= 1000) return (value / 1000).toFixed(2) + 's'\n return value.toFixed(0)\n}\n\nfunction VitalChip({ s }: { s: WebVitalSignal }) {\n const { t } = useI18n()\n const rating = webVitalRating(s.name, s.value)\n const color = RATING_COLOR[rating]\n const unit = WEB_VITAL_UNIT[s.name]\n return (\n <span\n data-vital={s.name}\n data-rating={rating}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '5px',\n padding: '3px 8px',\n borderRadius: '999px',\n background: '#1a1a1a',\n border: `1px solid ${color}33`,\n fontSize: '11px',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n }}\n >\n <span\n aria-label={t.ratingLabel(rating)}\n style={{\n width: '6px',\n height: '6px',\n borderRadius: '50%',\n background: color,\n flex: '0 0 6px',\n }}\n />\n <strong style={{ color: '#e6e6e6' }}>{s.name}</strong>\n <span style={{ color }}>\n {formatVitalValue(s.name, s.value)}\n {unit !== 's' ? unit : ''}\n </span>\n </span>\n )\n}\n\nexport function SummaryHeader({ signals, grouped, kindsPresent, onKindClick }: SummaryHeaderProps) {\n const { t } = useI18n()\n // Latest web-vital per name — vitals can be re-reported and the freshest\n // value is what matters in the summary.\n const latestVitals = new Map<WebVitalSignal['name'], WebVitalSignal>()\n for (const s of signals) {\n if (s.kind === 'web-vital') latestVitals.set(s.name, s)\n }\n const vitals = Array.from(latestVitals.values())\n const nonVitalKinds = kindsPresent.filter((k) => k !== 'web-vital')\n\n return (\n <div\n style={{\n marginBottom: '8px',\n padding: '8px 10px',\n background: '#141414',\n border: '1px solid #1f1f1f',\n borderRadius: '8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '6px',\n }}\n >\n {vitals.length > 0 && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}>\n {vitals.map((v) => (\n <VitalChip key={v.name} s={v} />\n ))}\n </div>\n )}\n {nonVitalKinds.length > 0 && (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '10px',\n fontSize: '11px',\n color: '#aaa',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n }}\n >\n {nonVitalKinds.map((k) => {\n const list = grouped[k]\n const sev = worstSeverity(list)\n const color = sev === 'low' ? '#aaa' : SEVERITY_COLOR[sev]\n return (\n <span\n key={k}\n data-summary-kind={k}\n onClick={() => onKindClick?.(k)}\n style={{\n cursor: onKindClick ? 'pointer' : 'default',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n }}\n title={t.signalsTitle(list.length, t.kindLabel(k))}\n >\n {sev !== 'low' && (\n <span\n style={{\n width: '6px',\n height: '6px',\n borderRadius: '50%',\n background: color,\n flex: '0 0 6px',\n }}\n />\n )}\n <span>{t.kindLabel(k)}</span>\n <strong style={{ color }}>{list.length}</strong>\n </span>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import { h, Fragment } from 'preact'\nimport { useLayoutEffect, useMemo, useRef, useState } from 'preact/hooks'\nimport type { Signal, SignalKind, HeapSample, HeapTrendClass } from '@react-perfscope/core'\nimport { analyzeHeapTrend, analyzeFrames } from '@react-perfscope/core'\nimport { severityForSignal, SEVERITY_OVERLAY_COLOR } from './severity'\nimport { useI18n } from './i18n'\n\ninterface TimelineProps {\n signals: Signal[]\n /** Recording duration in ms. */\n duration: number\n /** Recording start time (performance.now() value). Used to convert\n * absolute signal timestamps to recording-relative ones. */\n startedAt: number\n /** Heap-usage series, when performance.memory was available. */\n heapSamples?: HeapSample[]\n /** requestAnimationFrame timestamps for the frame-rate strip. */\n frames?: number[]\n onJump?: (signal: Signal) => void\n}\n\nconst LANE_ORDER: SignalKind[] = [\n 'long-task',\n 'interaction',\n 'forced-reflow',\n 'layout-shift',\n 'render',\n 'network',\n]\n\nfunction signalAbsoluteTime(s: Signal): number | null {\n if (s.kind === 'web-vital') return null\n if (s.kind === 'network') return s.startedAt\n return s.at\n}\n\nfunction signalDuration(s: Signal): number {\n if (\n s.kind === 'long-task' ||\n s.kind === 'forced-reflow' ||\n s.kind === 'render' ||\n s.kind === 'network' ||\n s.kind === 'interaction'\n ) {\n return s.duration\n }\n return 0\n}\n\nfunction formatTime(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`\n if (ms >= 1) return `${ms.toFixed(0)}ms`\n return `${ms.toFixed(1)}ms`\n}\n\nfunction niceStep(span: number, target: number): number {\n const raw = Math.max(span, 1) / target\n const mag = Math.pow(10, Math.floor(Math.log10(raw)))\n const norm = raw / mag\n if (norm < 1.5) return 1 * mag\n if (norm < 3) return 2 * mag\n if (norm < 7) return 5 * mag\n return 10 * mag\n}\n\n// Ticks at \"nice\" absolute times that fall inside the [start, end] window.\nfunction niceTicks(start: number, end: number, target = 5): number[] {\n const span = Math.max(end - start, 1)\n const step = niceStep(span, target)\n const first = Math.ceil(start / step) * step\n const ticks: number[] = []\n for (let t = first; t <= end + 1e-6; t += step) ticks.push(t)\n return ticks\n}\n\nconst LANE_HEIGHT = 28\n// Network requests fire in parallel and overlap in time, so a single row would\n// stack them on top of each other. The network lane lays overlapping bars onto\n// separate rows (a waterfall) and grows its height to fit.\nconst NET_BAR_H = 7\nconst NET_ROW_GAP = 3\n// Per-row brightness steps for stacked network bars. Non-monotonic so adjacent\n// rows always contrast, and it never lands back on the previous value.\nconst NET_ROW_BRIGHTNESS = [1, 0.78, 1.22, 0.9, 1.12]\n// Wide enough for the longest lane label (\"forced-reflow\") plus its count\n// badge, so every lane's track starts at the same x and 0.0ms lines up.\nconst LABEL_COL_WIDTH = 124\nconst AXIS_HEIGHT = 22\nconst TRACK_PAD_X = 4\nconst MIN_BAR_W = 6\nconst MARKER_D = 9\n// Point events within this many ms of each other merge into one marker. An\n// absolute time window (not a fraction of the recording) so a long recording\n// doesn't over-merge events that are actually far apart — roughly one frame.\nconst CLUSTER_BIN_MS = 16\n// Minimum horizontal density. When fitting the whole recording into the visible\n// track would squeeze it below this, the track grows to a fixed pixel width and\n// scrolls instead, so dense early bursts stay legible in long recordings.\nconst MIN_PX_PER_SEC = 80\n\ninterface Plotted {\n s: Signal\n // [0, 1] left position within the track\n startFrac: number\n // [0, 1] width within the track (0 for instants)\n widthFrac: number\n}\n\nfunction plotLane(\n signals: Signal[],\n kind: SignalKind,\n winStart: number,\n winEnd: number,\n startedAt: number,\n): Plotted[] {\n const span = Math.max(winEnd - winStart, 1)\n const out: Plotted[] = []\n for (const s of signals) {\n if (s.kind !== kind) continue\n const tAbs = signalAbsoluteTime(s)\n if (tAbs == null) continue\n const t = tAbs - startedAt - winStart\n const d = signalDuration(s)\n const startFrac = Math.max(0, Math.min(1, t / span))\n const widthFrac = Math.max(0, Math.min(1 - startFrac, d / span))\n out.push({ s, startFrac, widthFrac })\n }\n return out\n}\n\n// Greedy waterfall packing: place each bar on the first row whose last bar ends\n// (visually, in px, honoring MIN_BAR_W) before this one starts. Bars must be\n// sorted by startFrac. Returns each bar's row index and the total row count so\n// the lane can size itself. Lets overlapping parallel requests sit side-by-side\n// on separate rows instead of hiding behind each other.\nfunction packRows(bars: Plotted[], trackInnerPx: number): { rows: number[]; rowCount: number } {\n const GAP_PX = 2\n const rowEnds: number[] = []\n const rows: number[] = []\n for (const b of bars) {\n const startPx = b.startFrac * trackInnerPx\n const endPx = startPx + Math.max(MIN_BAR_W, b.widthFrac * trackInnerPx)\n let placed = -1\n for (let r = 0; r < rowEnds.length; r++) {\n if (startPx >= rowEnds[r]! + GAP_PX) {\n placed = r\n break\n }\n }\n if (placed === -1) {\n placed = rowEnds.length\n rowEnds.push(0)\n }\n rowEnds[placed] = endPx\n rows.push(placed)\n }\n return { rows, rowCount: Math.max(1, rowEnds.length) }\n}\n\ntype Severity = 'low' | 'medium' | 'high'\nconst SEV_RANK: Record<Severity, number> = { low: 0, medium: 1, high: 2 }\n\ninterface PointCluster {\n startFrac: number\n count: number\n rep: Signal\n worst: Severity\n members: Signal[]\n}\n\n// Collapse the visual noise of many near-simultaneous point events (e.g. 58\n// forced-reflows in a 5ms burst, or a whole component tree re-rendering in one\n// commit) into a single marker carrying a count. Items wide enough to read as a\n// duration bar are left alone; only point-like items within `binFrac` of each\n// other are merged. `binFrac` is the caller's time window (CLUSTER_BIN_MS)\n// expressed as a fraction of the recording, so merging tracks real elapsed time\n// rather than a fixed slice of the bar — a long recording won't fuse events\n// that are seconds apart. The representative signal is the worst-severity one so\n// the marker color stays honest, and every merged signal is kept in `members`\n// so the tooltip can list what actually happened (which components rendered).\nfunction clusterLane(items: Plotted[], binFrac: number): { bars: Plotted[]; clusters: PointCluster[] } {\n const bars: Plotted[] = []\n const pts: Plotted[] = []\n for (const it of items) {\n if (it.widthFrac >= binFrac) bars.push(it)\n else pts.push(it)\n }\n pts.sort((a, b) => a.startFrac - b.startFrac)\n const clusters: PointCluster[] = []\n let i = 0\n while (i < pts.length) {\n const start = pts[i]!.startFrac\n let rep = pts[i]!.s\n let worst = severityForSignal(pts[i]!.s)\n let sum = 0\n let j = i\n const members: Signal[] = []\n while (j < pts.length && pts[j]!.startFrac - start <= binFrac) {\n const sev = severityForSignal(pts[j]!.s)\n if (SEV_RANK[sev] > SEV_RANK[worst]) {\n worst = sev\n rep = pts[j]!.s\n }\n members.push(pts[j]!.s)\n sum += pts[j]!.startFrac\n j++\n }\n clusters.push({ startFrac: sum / members.length, count: members.length, rep, worst, members })\n i = j\n }\n return { bars, clusters }\n}\n\n// Distinct component names in a render cluster, with how many times each\n// rendered, ordered by first appearance — drives the tooltip breakdown so a\n// single marker can tell you the whole commit rendered App, Counter, ….\nfunction renderBreakdown(members: Signal[]): { component: string; count: number }[] {\n const order: string[] = []\n const counts = new Map<string, number>()\n for (const s of members) {\n if (s.kind !== 'render') continue\n // Render signals are coalesced per commit; count each component that\n // re-rendered inside them.\n for (const m of s.members ?? [s]) {\n if (!counts.has(m.component)) order.push(m.component)\n counts.set(m.component, (counts.get(m.component) ?? 0) + 1)\n }\n }\n return order.map((c) => ({ component: c, count: counts.get(c)! }))\n}\n\nconst HEAP_STRIP_H = 46\n// SVG drawn in a fixed unit box and stretched to the track width via\n// preserveAspectRatio=\"none\", so x lines up with the signal lanes below.\nconst HEAP_VB_W = 100\nconst HEAP_VB_H = 100\nconst HEAP_TREND_COLOR: Record<HeapTrendClass, string> = {\n stable: '#3b82f6',\n growing: '#f59e0b',\n 'leak-suspected': '#ef4444',\n}\n\nfunction formatBytes(b: number): string {\n if (b >= 1024 * 1024) return `${(b / (1024 * 1024)).toFixed(1)}MB`\n if (b >= 1024) return `${(b / 1024).toFixed(0)}KB`\n return `${b}B`\n}\n\n// Build the area + line SVG paths (in the unit viewBox) plus the heap range,\n// scaling `used` across [min,max] so the sawtooth fills the strip vertically.\nfunction buildHeapPaths(\n samples: HeapSample[],\n startedAt: number,\n safeDur: number,\n): { area: string; line: string; min: number; max: number } | null {\n if (samples.length === 0) return null\n let lo = Infinity\n let hi = -Infinity\n for (const s of samples) {\n if (s.used < lo) lo = s.used\n if (s.used > hi) hi = s.used\n }\n const range = Math.max(hi - lo, 1)\n const pts = samples.map((s) => {\n const x = Math.max(0, Math.min(HEAP_VB_W, ((s.at - startedAt) / safeDur) * HEAP_VB_W))\n const y = HEAP_VB_H - ((s.used - lo) / range) * HEAP_VB_H\n return { x, y }\n })\n const line = pts.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(2)} ${p.y.toFixed(2)}`).join(' ')\n const last = pts[pts.length - 1]!\n const first = pts[0]!\n const area = `${line} L${last.x.toFixed(2)} ${HEAP_VB_H} L${first.x.toFixed(2)} ${HEAP_VB_H} Z`\n return { area, line, min: lo, max: hi }\n}\n\nfunction HeapStrip({\n samples,\n startedAt,\n safeDur,\n trackWidth,\n scrolls,\n}: {\n samples: HeapSample[] | undefined\n startedAt: number\n safeDur: number\n trackWidth: number\n scrolls: boolean\n}) {\n const { t } = useI18n()\n const has = !!samples && samples.length > 0\n const trend = useMemo(() => (has ? analyzeHeapTrend(samples!) : null), [samples, has])\n const paths = useMemo(\n () => (has ? buildHeapPaths(samples!, startedAt, safeDur) : null),\n [samples, has, startedAt, safeDur],\n )\n const color = trend ? HEAP_TREND_COLOR[trend.classification] : '#3b82f6'\n // The hint tooltip is taller than the (short) timeline scroll area, so an\n // absolutely-positioned box gets clipped by its overflow. Render it\n // position:fixed against the viewport instead (like the signal tooltip),\n // anchored to the icon and clamped/flipped to stay on screen.\n const [hintAnchor, setHintAnchor] = useState<{ left: number; top: number; bottom: number } | null>(\n null,\n )\n const hintRef = useRef<HTMLDivElement | null>(null)\n const [hintPos, setHintPos] = useState<{ left: number; top: number } | null>(null)\n\n useLayoutEffect(() => {\n if (!hintAnchor) {\n setHintPos(null)\n return\n }\n const el = hintRef.current\n if (!el) return\n const r = el.getBoundingClientRect()\n const vw = window.innerWidth\n const vh = window.innerHeight\n const gap = 6\n let left = hintAnchor.left\n if (left + r.width + 8 > vw) left = vw - r.width - 8\n if (left < 8) left = 8\n let top = hintAnchor.bottom + gap\n if (top + r.height + 8 > vh) top = hintAnchor.top - r.height - gap\n if (top < 8) top = 8\n setHintPos({ left, top })\n }, [hintAnchor])\n\n return (\n <div\n data-heap-strip=\"\"\n style={{\n display: 'flex',\n alignItems: 'stretch',\n height: `${HEAP_STRIP_H}px`,\n background: '#111',\n borderBottom: '1px solid #1c1c1c',\n }}\n >\n <div\n style={{\n flex: `0 0 ${LABEL_COL_WIDTH}px`,\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'sticky',\n left: 0,\n zIndex: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n gap: '2px',\n padding: '0 8px',\n borderRight: '1px solid #1c1c1c',\n background: '#0f0f0f',\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '4px', color: '#9a9a9a' }}>\n {t.heapLabel}\n {has && (\n <span\n data-heap-hint=\"\"\n aria-label={t.heapExtensionHint}\n onMouseEnter={(e) => {\n const r = (e.currentTarget as HTMLElement).getBoundingClientRect()\n setHintAnchor({ left: r.left, top: r.top, bottom: r.bottom })\n }}\n onMouseLeave={() => setHintAnchor(null)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n border: '1px solid #555',\n color: '#888',\n fontSize: '9px',\n lineHeight: 1,\n cursor: 'help',\n }}\n >\n i\n </span>\n )}\n </span>\n {has && trend && (\n <span data-heap-trend={trend.classification} style={{ color, fontSize: '10px' }}>\n {t.heapTrendLabel(trend.classification)}\n {trend.classification !== 'stable' &&\n ` · +${(trend.slopeBytesPerMin / (1024 * 1024)).toFixed(1)}MB/min`}\n </span>\n )}\n </div>\n <div\n style={{\n flex: scrolls ? '0 0 auto' : 1,\n width: scrolls ? `${trackWidth}px` : undefined,\n position: 'relative',\n padding: `0 ${TRACK_PAD_X}px`,\n }}\n >\n {has && paths ? (\n <Fragment>\n <svg\n width=\"100%\"\n height={HEAP_STRIP_H}\n viewBox={`0 0 ${HEAP_VB_W} ${HEAP_VB_H}`}\n preserveAspectRatio=\"none\"\n style={{ display: 'block' }}\n aria-hidden=\"true\"\n >\n <path d={paths.area} fill={color} fillOpacity={0.16} />\n <path d={paths.line} fill=\"none\" stroke={color} strokeWidth={1.2} vectorEffect=\"non-scaling-stroke\" />\n </svg>\n <span\n style={{\n position: 'absolute',\n top: '2px',\n right: '6px',\n color: '#666',\n fontSize: '10px',\n pointerEvents: 'none',\n }}\n >\n {formatBytes(paths.min)}–{formatBytes(paths.max)}\n </span>\n </Fragment>\n ) : (\n <span\n style={{\n position: 'absolute',\n top: '50%',\n left: '8px',\n transform: 'translateY(-50%)',\n color: '#666',\n fontSize: '10px',\n }}\n >\n {t.heapUnsupported}\n </span>\n )}\n </div>\n {hintAnchor && (\n <div\n ref={hintRef}\n role=\"tooltip\"\n style={{\n position: 'fixed',\n left: `${hintPos ? hintPos.left : 0}px`,\n top: `${hintPos ? hintPos.top : 0}px`,\n visibility: hintPos ? 'visible' : 'hidden',\n width: '220px',\n padding: '7px 9px',\n background: '#0d0d0d',\n border: '1px solid #2a2a2a',\n borderRadius: '6px',\n color: '#cfcfcf',\n fontSize: '10px',\n fontWeight: 400,\n lineHeight: 1.5,\n whiteSpace: 'normal',\n boxShadow: '0 4px 14px rgba(0,0,0,0.5)',\n zIndex: 2147483647,\n pointerEvents: 'none',\n }}\n >\n {t.heapExtensionHint}\n </div>\n )}\n </div>\n )\n}\n\nconst FPS_GOOD = '#34c759'\nconst FPS_OK = '#f59e0b'\nconst FPS_BAD = '#ef4444'\n\nfunction fpsColor(minFps: number): string {\n if (minFps >= 50) return FPS_GOOD\n if (minFps >= 30) return FPS_OK\n return FPS_BAD\n}\n\nfunction buildFpsPaths(\n series: { at: number; fps: number }[],\n startedAt: number,\n safeDur: number,\n): { area: string; line: string; max: number } | null {\n if (series.length === 0) return null\n let max = 60\n for (const s of series) if (s.fps > max) max = s.fps\n const pts = series.map((s) => {\n const x = Math.max(0, Math.min(HEAP_VB_W, ((s.at - startedAt) / safeDur) * HEAP_VB_W))\n const y = HEAP_VB_H - (Math.min(s.fps, max) / max) * HEAP_VB_H\n return { x, y }\n })\n // Points sit at bucket midpoints, so the series stops short of both edges.\n // Pin the ends to the track edges (flat-extending the first/last reading) so\n // the chart fills the full width like the heap strip.\n if (pts.length === 1) pts.push({ x: HEAP_VB_W, y: pts[0]!.y })\n pts[0]!.x = 0\n pts[pts.length - 1]!.x = HEAP_VB_W\n const line = pts.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(2)} ${p.y.toFixed(2)}`).join(' ')\n const last = pts[pts.length - 1]!\n const first = pts[0]!\n const area = `${line} L${last.x.toFixed(2)} ${HEAP_VB_H} L${first.x.toFixed(2)} ${HEAP_VB_H} Z`\n return { area, line, max }\n}\n\nfunction FpsStrip({\n frames,\n startedAt,\n safeDur,\n trackWidth,\n scrolls,\n}: {\n frames: number[] | undefined\n startedAt: number\n safeDur: number\n trackWidth: number\n scrolls: boolean\n}) {\n const { t } = useI18n()\n const has = !!frames && frames.length > 0\n const stats = useMemo(() => (has ? analyzeFrames(frames!) : null), [frames, has])\n const paths = useMemo(\n () => (stats ? buildFpsPaths(stats.series, startedAt, safeDur) : null),\n [stats, startedAt, safeDur],\n )\n const color = stats ? fpsColor(stats.minFps) : FPS_GOOD\n\n return (\n <div\n data-fps-strip=\"\"\n style={{\n display: 'flex',\n alignItems: 'stretch',\n height: `${HEAP_STRIP_H}px`,\n background: '#111',\n borderBottom: '1px solid #1c1c1c',\n }}\n >\n <div\n style={{\n flex: `0 0 ${LABEL_COL_WIDTH}px`,\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'sticky',\n left: 0,\n zIndex: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n gap: '2px',\n padding: '0 8px',\n borderRight: '1px solid #1c1c1c',\n background: '#0f0f0f',\n }}\n >\n <span style={{ color: '#9a9a9a' }}>{t.fpsLabel}</span>\n {stats && (\n <span data-fps-min={Math.round(stats.minFps)} style={{ color, fontSize: '10px' }}>\n {t.fpsBadge(Math.round(stats.minFps), stats.droppedFrames)}\n </span>\n )}\n </div>\n <div\n style={{\n flex: scrolls ? '0 0 auto' : 1,\n width: scrolls ? `${trackWidth}px` : undefined,\n position: 'relative',\n padding: `0 ${TRACK_PAD_X}px`,\n }}\n >\n {stats && paths ? (\n <Fragment>\n <svg\n width=\"100%\"\n height={HEAP_STRIP_H}\n viewBox={`0 0 ${HEAP_VB_W} ${HEAP_VB_H}`}\n preserveAspectRatio=\"none\"\n style={{ display: 'block' }}\n aria-hidden=\"true\"\n >\n <path d={paths.area} fill={color} fillOpacity={0.16} />\n <path d={paths.line} fill=\"none\" stroke={color} strokeWidth={1.2} vectorEffect=\"non-scaling-stroke\" />\n </svg>\n <span\n style={{ position: 'absolute', top: '2px', right: '6px', color: '#666', fontSize: '10px', pointerEvents: 'none' }}\n >\n {t.fpsWorst(Math.round(stats.longestFrameMs))}\n </span>\n </Fragment>\n ) : (\n <span\n style={{ position: 'absolute', top: '50%', left: '8px', transform: 'translateY(-50%)', color: '#666', fontSize: '10px' }}\n >\n {t.fpsUnsupported}\n </span>\n )}\n </div>\n </div>\n )\n}\n\nexport function Timeline({ signals, duration, startedAt, heapSamples, frames, onJump }: TimelineProps) {\n const { t } = useI18n()\n const trackRef = useRef<HTMLDivElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const contentRef = useRef<HTMLDivElement | null>(null)\n // Cursor line left in px, measured from the track's real geometry so it\n // lands exactly on the bars (the label column's rendered width can differ\n // from LABEL_COL_WIDTH, so a hardcoded offset would drift).\n const [cursorLeftPx, setCursorLeftPx] = useState<number | null>(null)\n const [hovered, setHovered] = useState<{\n s: Signal\n clientX: number\n clientY: number\n count?: number\n members?: Signal[]\n } | null>(null)\n const [cursorFrac, setCursorFrac] = useState<number | null>(null)\n const tipRef = useRef<HTMLDivElement | null>(null)\n const [tipPos, setTipPos] = useState<{ left: number; top: number } | null>(null)\n // Visible track width (container minus the sticky label column). Drives\n // whether the recording fits or needs to scroll horizontally.\n const [viewportTrackWidth, setViewportTrackWidth] = useState(0)\n\n useLayoutEffect(() => {\n const el = containerRef.current\n if (!el) return\n const measure = () => setViewportTrackWidth(Math.max(0, el.clientWidth - LABEL_COL_WIDTH))\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n // Position the tooltip after it renders so it never spills off-screen. The\n // panel commonly sits at the right edge, so anchoring a fixed nowrap tooltip\n // to the right of a bar would clip it. We measure the rendered tooltip, then\n // flip it to the left and clamp vertically as needed.\n useLayoutEffect(() => {\n if (!hovered) {\n setTipPos(null)\n return\n }\n const el = tipRef.current\n if (!el) return\n const r = el.getBoundingClientRect()\n const vw = window.innerWidth\n const vh = window.innerHeight\n const gap = 10\n let left = hovered.clientX + gap\n if (left + r.width + 8 > vw) left = hovered.clientX - r.width - gap\n if (left < 8) left = Math.max(8, Math.min(vw - r.width - 8, hovered.clientX - r.width / 2))\n let top = hovered.clientY - r.height - 6\n if (top < 8) top = hovered.clientY + 18\n if (top + r.height + 8 > vh) top = Math.max(8, vh - r.height - 8)\n setTipPos({ left, top })\n }, [hovered])\n\n const presentLanes = useMemo(\n () => LANE_ORDER.filter((k) => signals.some((s) => s.kind === k)),\n [signals],\n )\n\n // The axis spans the whole recording: 0 (start) to its full duration (stop).\n const winStart = 0\n const winEnd = Math.max(duration, 1)\n const safeDur = winEnd\n const ticks = useMemo(() => niceTicks(winStart, winEnd), [winStart, winEnd])\n\n // Grow the track to a fixed pixel width (and scroll) when fitting the whole\n // recording would drop below MIN_PX_PER_SEC; otherwise fit the viewport.\n const neededTrackWidth = (safeDur / 1000) * MIN_PX_PER_SEC\n const trackWidth = Math.max(viewportTrackWidth, neededTrackWidth)\n const scrolls = viewportTrackWidth > 0 && trackWidth > viewportTrackWidth + 0.5\n\n const hasHeap = !!heapSamples && heapSamples.length > 0\n const hasFrames = !!frames && frames.length > 0\n if (presentLanes.length === 0 && !hasHeap && !hasFrames) {\n return (\n <div style={{ color: '#888', padding: '20px', textAlign: 'center', fontSize: '11px' }}>\n {t.noTimeBound}\n </div>\n )\n }\n\n function handleMouseMove(e: MouseEvent) {\n const track = trackRef.current\n const content = contentRef.current\n if (!track || !content) return\n const rect = track.getBoundingClientRect()\n const inner = rect.width - 2 * TRACK_PAD_X\n const frac = Math.max(0, Math.min(1, (e.clientX - rect.left - TRACK_PAD_X) / inner))\n setCursorFrac(frac)\n // Cursor line lives inside the (possibly scrolled) content div, so measure\n // its left in content-local coordinates — scrolling shifts track and content\n // together, keeping this offset stable.\n const contLeft = content.getBoundingClientRect().left\n setCursorLeftPx(rect.left - contLeft + TRACK_PAD_X + inner * frac)\n }\n function handleMouseLeave() {\n setCursorFrac(null)\n setCursorLeftPx(null)\n setHovered(null)\n }\n\n const cursorTime = cursorFrac != null ? winStart + cursorFrac * safeDur : null\n\n return (\n <div\n style={{\n userSelect: 'none',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n }}\n >\n {/* Lane rows */}\n <div\n ref={containerRef}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n style={{\n position: 'relative',\n overflowX: scrolls ? 'auto' : 'visible',\n // overflow-x:auto forces overflow-y to auto too, which would clip the\n // cursor time label sitting at top:-14px — reserve that space.\n paddingTop: scrolls ? '14px' : 0,\n }}\n >\n <div\n ref={contentRef}\n style={{\n position: 'relative',\n width: scrolls ? `${LABEL_COL_WIDTH + trackWidth}px` : '100%',\n }}\n >\n {/* Cursor line — drawn across all lanes when hovering */}\n {cursorFrac != null && (\n <div\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: `${cursorLeftPx ?? 0}px`,\n width: '1px',\n background: '#3b82f680',\n pointerEvents: 'none',\n zIndex: 1,\n }}\n />\n )}\n {cursorFrac != null && cursorTime != null && (\n <div\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n top: '-14px',\n left: `${cursorLeftPx ?? 0}px`,\n transform:\n cursorFrac < 0.06\n ? 'translateX(0)'\n : cursorFrac > 0.94\n ? 'translateX(-100%)'\n : 'translateX(-50%)',\n fontSize: '10px',\n color: '#3b82f6',\n background: '#0d0d0d',\n padding: '0 4px',\n borderRadius: '3px',\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n zIndex: 2,\n }}\n >\n {formatTime(cursorTime)}\n </div>\n )}\n <HeapStrip\n samples={heapSamples}\n startedAt={startedAt}\n safeDur={safeDur}\n trackWidth={trackWidth}\n scrolls={scrolls}\n />\n <FpsStrip\n frames={frames}\n startedAt={startedAt}\n safeDur={safeDur}\n trackWidth={trackWidth}\n scrolls={scrolls}\n />\n {presentLanes.map((kind, li) => {\n const items = plotLane(signals, kind, winStart, winEnd, startedAt)\n const { bars, clusters } = clusterLane(items, CLUSTER_BIN_MS / safeDur)\n const altBg = li % 2 === 0 ? '#131313' : '#161616'\n // Network bars overlap (parallel requests), so pack them onto stacked\n // rows and grow the lane to fit. Other lanes keep the single-row layout.\n const isNet = kind === 'network'\n const trackInner = Math.max(1, trackWidth - 2 * TRACK_PAD_X)\n let laneBars = bars\n let barRows: number[] = []\n let laneHeight = LANE_HEIGHT\n if (isNet && bars.length > 0) {\n laneBars = [...bars].sort((a, b) => a.startFrac - b.startFrac)\n const packed = packRows(laneBars, trackInner)\n barRows = packed.rows\n laneHeight = Math.max(LANE_HEIGHT, packed.rowCount * (NET_BAR_H + NET_ROW_GAP) + NET_ROW_GAP)\n }\n return (\n <div\n key={kind}\n data-lane={kind}\n style={{\n display: 'flex',\n alignItems: 'stretch',\n height: `${laneHeight}px`,\n background: altBg,\n borderBottom: '1px solid #1c1c1c',\n }}\n >\n {/* Lane label — pinned left so the lane stays identifiable while\n the track scrolls horizontally. */}\n <div\n style={{\n flex: `0 0 ${LABEL_COL_WIDTH}px`,\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'sticky',\n left: 0,\n zIndex: 5,\n display: 'flex',\n alignItems: 'center',\n padding: '0 8px',\n color: '#9a9a9a',\n borderRight: '1px solid #1c1c1c',\n background: '#0f0f0f',\n }}\n >\n <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {t.kindLabel(kind)}\n </span>\n <span style={{ color: '#555', fontSize: '10px', marginLeft: '4px' }}>{items.length}</span>\n </div>\n\n {/* Track */}\n <div\n ref={li === 0 ? trackRef : undefined}\n style={{\n flex: scrolls ? '0 0 auto' : 1,\n width: scrolls ? `${trackWidth}px` : undefined,\n position: 'relative',\n padding: `0 ${TRACK_PAD_X}px`,\n }}\n >\n {/* Tick guide lines */}\n {ticks.map((t, ti) => {\n const leftPct = ((t - winStart) / safeDur) * 100\n return (\n <div\n key={`tg-${ti}`}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: `calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${leftPct / 100})`,\n width: '1px',\n background: '#1f1f1f',\n }}\n />\n )\n })}\n\n {/* Duration bars — wide enough to read as a real interval.\n Network bars sit on packed rows (waterfall); others span the\n lane vertically. */}\n {laneBars.map((p, i) => {\n const sev = severityForSignal(p.s)\n const color = SEVERITY_OVERLAY_COLOR[sev]\n const isHot = hovered?.s === p.s\n const baseOpacity = sev === 'low' ? 0.85 : sev === 'medium' ? 0.95 : 1\n const glow =\n sev === 'high' ? `0 0 8px ${color}cc, 0 0 0 1px ${color}` : `0 0 0 1px ${color}`\n const row = isNet ? (barRows[i] ?? 0) : 0\n const barTop = isNet ? `${NET_ROW_GAP + row * (NET_BAR_H + NET_ROW_GAP)}px` : '6px'\n // Stacked network bars often share a severity (same hue), so step\n // brightness per row to keep neighbours distinguishable without\n // losing the severity colour meaning.\n const netBrightness = isNet ? NET_ROW_BRIGHTNESS[row % NET_ROW_BRIGHTNESS.length]! : 1\n return (\n <div\n key={`bar-${kind}-${i}`}\n data-bar={kind}\n onMouseEnter={(e: MouseEvent) => {\n const r = (e.currentTarget as HTMLElement).getBoundingClientRect()\n setHovered({ s: p.s, clientX: r.left + r.width / 2, clientY: r.top })\n }}\n onMouseLeave={() => setHovered(null)}\n onClick={() => onJump?.(p.s)}\n title={formatTime((signalAbsoluteTime(p.s) ?? startedAt) - startedAt)}\n style={{\n position: 'absolute',\n top: barTop,\n bottom: isNet ? undefined : '6px',\n height: isNet ? `${NET_BAR_H}px` : undefined,\n left: `clamp(${TRACK_PAD_X}px, calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${p.startFrac.toFixed(4)}), calc(100% - ${MIN_BAR_W + TRACK_PAD_X}px))`,\n width: `min(calc(100% - ${2 * TRACK_PAD_X}px), max(${MIN_BAR_W}px, calc((100% - ${2 * TRACK_PAD_X}px) * ${p.widthFrac.toFixed(4)})))`,\n background: `linear-gradient(180deg, ${color}, ${color}cc)`,\n opacity: isHot ? 1 : baseOpacity,\n borderRadius: '3px',\n boxShadow: isHot ? `0 0 10px ${color}, 0 0 0 1px #fff6` : glow,\n cursor: onJump ? 'pointer' : 'default',\n transition: 'transform 90ms ease, box-shadow 90ms ease',\n transform: isHot ? 'scaleY(1.18)' : 'scaleY(1)',\n filter: isNet ? `brightness(${netBrightness})` : undefined,\n zIndex: isHot ? 3 : 2,\n }}\n />\n )\n })}\n\n {/* Point clusters — instant events, merged when they pile up.\n Marker grows with the count so a busy burst reads as one\n bigger dot, and a donut ring marks count > 1. */}\n {clusters.map((c, i) => {\n const color = SEVERITY_OVERLAY_COLOR[c.worst]\n const leftPct = c.startFrac * 100\n const isHot = hovered?.s === c.rep\n const baseOpacity = c.worst === 'low' ? 0.85 : c.worst === 'medium' ? 0.95 : 1\n const d = MARKER_D + Math.min(6, Math.log2(c.count) * 1.6)\n const glow =\n c.worst === 'high'\n ? `0 0 8px ${color}cc, 0 0 0 1px ${color}`\n : `0 0 0 1px ${color}`\n const ring = c.count > 1 ? `, inset 0 0 0 1.5px #0d0d0d` : ''\n const markerLeft = `clamp(${d / 2}px, calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${c.startFrac.toFixed(4)}), calc(100% - ${d / 2}px))`\n // Flip the count badge to the left of the dot near the right\n // edge so it never spills out of the track.\n const badgeFlip = c.startFrac > 0.85\n return (\n <Fragment key={`pt-${kind}-${i}`}>\n <div\n data-bar={kind}\n onMouseEnter={(e: MouseEvent) => {\n const r = (e.currentTarget as HTMLElement).getBoundingClientRect()\n setHovered({\n s: c.rep,\n clientX: r.left + r.width / 2,\n clientY: r.top,\n count: c.count,\n members: c.members,\n })\n }}\n onMouseLeave={() => setHovered(null)}\n onClick={() => onJump?.(c.rep)}\n title={formatTime((signalAbsoluteTime(c.rep) ?? startedAt) - startedAt)}\n style={{\n position: 'absolute',\n top: '50%',\n left: markerLeft,\n width: `${d}px`,\n height: `${d}px`,\n marginLeft: `-${d / 2}px`,\n transform: isHot ? 'translateY(-50%) scale(1.35)' : 'translateY(-50%)',\n background: color,\n opacity: isHot ? 1 : baseOpacity,\n borderRadius: '50%',\n boxShadow: (isHot ? `0 0 8px ${color}, 0 0 0 1px ${color}` : glow) + ring,\n cursor: onJump ? 'pointer' : 'default',\n transition: 'transform 90ms ease, box-shadow 90ms ease',\n zIndex: isHot ? 3 : 2,\n }}\n />\n {c.count > 1 && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n top: '50%',\n left: markerLeft,\n marginLeft: badgeFlip ? `-${d / 2 + 3}px` : `${d / 2 + 3}px`,\n transform: badgeFlip ? 'translate(-100%, -50%)' : 'translateY(-50%)',\n fontSize: '9px',\n fontWeight: 600,\n lineHeight: 1,\n color: '#e8e8e8',\n background: '#0d0d0dcc',\n padding: '1px 3px',\n borderRadius: '3px',\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n zIndex: isHot ? 4 : 3,\n }}\n >\n ×{c.count}\n </span>\n )}\n </Fragment>\n )\n })}\n </div>\n </div>\n )\n })}\n\n {/* Time axis */}\n <div\n style={{\n display: 'flex',\n height: `${AXIS_HEIGHT}px`,\n background: '#0f0f0f',\n color: '#666',\n fontSize: '10px',\n }}\n >\n <div\n style={{\n flex: `0 0 ${LABEL_COL_WIDTH}px`,\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'sticky',\n left: 0,\n zIndex: 5,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n padding: '0 8px',\n borderRight: '1px solid #1c1c1c',\n background: '#0f0f0f',\n color: '#555',\n }}\n >\n {t.timeAxis}\n </div>\n <div\n style={{\n flex: scrolls ? '0 0 auto' : 1,\n width: scrolls ? `${trackWidth}px` : undefined,\n position: 'relative',\n padding: `0 ${TRACK_PAD_X}px`,\n }}\n >\n {ticks.map((t, ti) => {\n const leftPct = ((t - winStart) / safeDur) * 100\n const align =\n leftPct < 6 ? 'translateX(0)' : leftPct > 94 ? 'translateX(-100%)' : 'translateX(-50%)'\n return (\n <Fragment key={`tl-${ti}`}>\n <div\n style={{\n position: 'absolute',\n top: 0,\n height: '4px',\n width: '1px',\n background: '#444',\n left: `calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${leftPct / 100})`,\n }}\n />\n <div\n style={{\n position: 'absolute',\n top: '5px',\n left: `calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${leftPct / 100})`,\n transform: align,\n whiteSpace: 'nowrap',\n }}\n >\n {formatTime(t)}\n </div>\n </Fragment>\n )\n })}\n </div>\n </div>\n </div>\n\n </div>\n\n {hovered && (\n <div\n ref={tipRef}\n role=\"tooltip\"\n style={{\n position: 'fixed',\n // Until measured, park at the origin (hidden) so the un-flipped\n // nowrap box can't overflow the viewport right edge and flash a\n // scrollbar. useLayoutEffect then flips/clamps and reveals it.\n left: `${tipPos ? tipPos.left : 0}px`,\n top: `${tipPos ? tipPos.top : 0}px`,\n visibility: tipPos ? 'visible' : 'hidden',\n background: '#0d0d0d',\n border: '1px solid #2a2a2a',\n borderRadius: '4px',\n padding: '4px 8px',\n fontSize: '11px',\n color: '#e6e6e6',\n pointerEvents: 'none',\n zIndex: 2147483647,\n whiteSpace: 'nowrap',\n boxShadow: '0 4px 12px rgba(0,0,0,0.5)',\n }}\n >\n {hovered.s.kind === 'render' && hovered.members && hovered.count && hovered.count > 1 ? (\n <RenderClusterTip\n members={hovered.members}\n count={hovered.count}\n s={hovered.s}\n startedAt={startedAt}\n />\n ) : (\n <Fragment>\n <TooltipContent s={hovered.s} startedAt={startedAt} />\n {hovered.count != null && hovered.count > 1 && (\n <span style={{ color: '#888', marginLeft: '6px' }}>×{hovered.count}</span>\n )}\n </Fragment>\n )}\n </div>\n )}\n </div>\n )\n}\n\nconst BREAKDOWN_MAX = 6\n\nfunction RenderClusterTip({\n members,\n count,\n s,\n startedAt,\n}: {\n members: Signal[]\n count: number\n s: Signal\n startedAt: number\n}) {\n const tAbs = signalAbsoluteTime(s)\n const at = tAbs == null ? '' : `@ ${formatTime(tAbs - startedAt)}`\n const bd = renderBreakdown(members)\n const shown = bd.slice(0, BREAKDOWN_MAX)\n const more = bd.length - shown.length\n return (\n <Fragment>\n <div>\n <strong>{count} renders</strong> <span style={{ color: '#888' }}>{at}</span>\n </div>\n <div style={{ color: '#9a9a9a', marginTop: '2px' }}>\n {shown.map((b, i) => (\n <span key={b.component}>\n {i > 0 ? ' · ' : ''}\n {b.component}\n {b.count > 1 ? ` ×${b.count}` : ''}\n </span>\n ))}\n {more > 0 ? ` · +${more}` : ''}\n </div>\n </Fragment>\n )\n}\n\nfunction TooltipContent({ s, startedAt }: { s: Signal; startedAt: number }) {\n const sev = severityForSignal(s)\n const color = SEVERITY_OVERLAY_COLOR[sev]\n const tAbs = signalAbsoluteTime(s)\n const t = tAbs == null ? null : tAbs - startedAt\n const at = t == null ? '' : `@ ${formatTime(t)}`\n switch (s.kind) {\n case 'long-task':\n return <span><strong>long-task</strong> <span style={{ color }}>{s.duration.toFixed(0)}ms</span> {at}</span>\n case 'forced-reflow':\n return <span><strong>forced-reflow</strong> <span style={{ color }}>{s.duration.toFixed(2)}ms</span>{(s.count ?? 1) > 1 ? ` ×${s.count}` : ''} {at}</span>\n case 'layout-shift':\n return <span><strong>layout-shift</strong> <span style={{ color }}>{s.value.toFixed(3)}</span> {at}</span>\n case 'render':\n return <span><strong>{s.component}</strong> <span style={{ color }}>{s.duration.toFixed(2)}ms</span> {at}</span>\n case 'network':\n return <span><strong>{s.url.slice(0, 40)}</strong> <span style={{ color }}>{s.duration.toFixed(0)}ms</span> {at}</span>\n case 'interaction':\n return <span><strong>{s.eventType}</strong> <span style={{ color }}>{s.duration.toFixed(0)}ms</span> {at}</span>\n case 'web-vital':\n return null\n }\n}\n","import { h } from 'preact'\nimport type { RenderSignal } from '@react-perfscope/core'\nimport { severityForSignal, SEVERITY_COLOR } from './severity'\nimport { useI18n } from './i18n'\n\ninterface RenderInsightsProps {\n signals: RenderSignal[]\n onSelect?: (component: string) => void\n}\n\ninterface Aggregate {\n component: string\n count: number\n totalMs: number\n maxMs: number\n worstSeverity: 'low' | 'medium' | 'high'\n}\n\nfunction aggregate(signals: RenderSignal[]): Aggregate[] {\n const byName = new Map<string, RenderSignal[]>()\n for (const s of signals) {\n if (!byName.has(s.component)) byName.set(s.component, [])\n byName.get(s.component)!.push(s)\n }\n const result: Aggregate[] = []\n for (const [name, list] of byName) {\n let total = 0\n let max = 0\n let worst: 'low' | 'medium' | 'high' = 'low'\n for (const s of list) {\n total += s.duration\n if (s.duration > max) max = s.duration\n const sev = severityForSignal(s)\n if (sev === 'high' || (sev === 'medium' && worst === 'low')) worst = sev\n }\n result.push({ component: name, count: list.length, totalMs: total, maxMs: max, worstSeverity: worst })\n }\n result.sort((a, b) => b.totalMs - a.totalMs)\n return result\n}\n\nconst TOP_N = 5\n\nexport function RenderInsights({ signals, onSelect }: RenderInsightsProps) {\n const { t } = useI18n()\n if (signals.length === 0) return null\n const rows = aggregate(signals)\n const top = rows.slice(0, TOP_N)\n const max = top.length > 0 ? top[0]!.totalMs : 1\n const hiddenCount = rows.length - top.length\n\n return (\n <div\n style={{\n marginBottom: '8px',\n padding: '8px 10px',\n background: '#141414',\n border: '1px solid #1f1f1f',\n borderRadius: '8px',\n }}\n >\n <div style={{ fontSize: '10px', color: '#888', textTransform: 'uppercase', letterSpacing: '0.5px', marginBottom: '6px' }}>\n {t.topRenderers}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n {top.map((a) => {\n const widthPct = max > 0 ? Math.max(2, (a.totalMs / max) * 100) : 0\n const color = SEVERITY_COLOR[a.worstSeverity]\n return (\n <div\n key={a.component}\n data-component={a.component}\n onClick={() => onSelect?.(a.component)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '11px',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n cursor: onSelect ? 'pointer' : 'default',\n padding: '3px 0',\n }}\n title={t.rendererDetail(a.component, a.count, a.totalMs, a.maxMs)}\n >\n <strong style={{ flex: '0 0 30%', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {a.component}\n </strong>\n <div style={{ flex: '1', position: 'relative', height: '14px', background: '#1f1f1f', borderRadius: '2px' }}>\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n height: '100%',\n width: `${widthPct}%`,\n background: color,\n opacity: a.worstSeverity === 'low' ? 0.4 : 0.7,\n borderRadius: '2px',\n }}\n />\n </div>\n <span style={{ flex: '0 0 auto', color, minWidth: '56px', textAlign: 'right' }}>\n {a.totalMs.toFixed(1)}ms\n </span>\n <span style={{ flex: '0 0 auto', color: '#888', minWidth: '32px', textAlign: 'right' }}>\n ×{a.count}\n </span>\n </div>\n )\n })}\n {hiddenCount > 0 && (\n <div style={{ fontSize: '10px', color: '#666', marginTop: '2px' }}>\n {t.moreComponents(hiddenCount)}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { h } from 'preact'\nimport { correlate } from '@react-perfscope/core'\nimport type { Signal, Episode, InpPhase } from '@react-perfscope/core'\nimport { useI18n } from './i18n'\nimport { EpisodeMemberList } from './episode-shared'\n\ntype PhaseLabelKey = 'inputDelay' | 'processingTime' | 'presentation'\n\nconst PHASES: { phase: InpPhase; labelKey: PhaseLabelKey }[] = [\n { phase: 'input-delay', labelKey: 'inputDelay' },\n { phase: 'processing', labelKey: 'processingTime' },\n { phase: 'presentation', labelKey: 'presentation' },\n]\n\n/** Picks the interaction-anchored episode with the longest latency — the\n * interaction that defines INP for this recording. */\nfunction worstInteractionEpisode(signals: Signal[]): Episode | null {\n let worst: Episode | null = null\n for (const ep of correlate(signals)) {\n if (ep.anchor.kind !== 'interaction') continue\n if (!worst || ep.anchor.duration > worst.anchor.duration) worst = ep\n }\n return worst\n}\n\nfunction phaseMs(episode: Episode, phase: InpPhase): number {\n const a = episode.anchor\n if (a.kind !== 'interaction') return 0\n return phase === 'input-delay' ? a.inputDelay : phase === 'processing' ? a.processing : a.presentation\n}\n\nexport function InpEpisode({ signals }: { signals: Signal[] }) {\n const { t } = useI18n()\n const episode = worstInteractionEpisode(signals)\n if (!episode || episode.anchor.kind !== 'interaction') return null\n const a = episode.anchor\n const target = a.target ? ` on ${a.target}` : ''\n\n return (\n <div\n data-inp-episode\n style={{\n margin: '0 0 8px',\n border: '1px solid #1f1f1f',\n borderRadius: '6px',\n background: '#121212',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n overflow: 'hidden',\n }}\n >\n <div style={{ padding: '6px 8px', borderBottom: '1px solid #1f1f1f', color: '#ddd' }}>\n <strong>{a.eventType}</strong>\n {target} — <strong>{Math.round(a.duration)}ms</strong>{' '}\n <span style={{ color: '#888' }}>INP</span>\n </div>\n {PHASES.map(({ phase, labelKey }) => {\n const members = episode.members.filter((m) => m.phase === phase)\n return (\n <div\n key={phase}\n data-inp-phase={phase}\n style={{ display: 'flex', gap: '8px', padding: '5px 8px', borderTop: '1px solid #1a1a1a' }}\n >\n <div style={{ flex: '0 0 92px', color: '#aaa' }}>\n {t[labelKey]}\n <div style={{ color: '#666', fontSize: '10px' }}>{Math.round(phaseMs(episode, phase))}ms</div>\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <EpisodeMemberList members={members} />\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import { h } from 'preact'\nimport type { EpisodeMember } from '@react-perfscope/core'\n\nexport function memberLabel(m: EpisodeMember): string {\n const s = m.signal\n if (s.kind === 'render') return `${s.component} (${s.reason})`\n if (s.kind === 'forced-reflow') {\n const top = s.stack[0]\n return top ? `forced reflow · ${top.file}:${top.line}` : 'forced reflow'\n }\n return `layout shift ${s.value.toFixed(3)}`\n}\n\n/** One cross-signal member of an episode: its label, the render commit that\n * caused it (when attributed), and a confidence badge. Shared by the\n * interaction (INP) and long-task episode views. */\nexport function EpisodeMemberRow({ member }: { member: EpisodeMember }) {\n return (\n <div\n data-member-kind={member.signal.kind}\n style={{ display: 'flex', alignItems: 'center', gap: '6px', padding: '1px 0', color: '#ccc' }}\n >\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {memberLabel(member)}\n </span>\n {member.causedBy && (\n <span style={{ flex: '0 0 auto', color: '#888' }}>← {member.causedBy.component}</span>\n )}\n {member.confidence === 'caused' && (\n <span\n style={{\n flex: '0 0 auto',\n fontSize: '9px',\n color: '#e0a030',\n border: '1px solid #5a4410',\n borderRadius: '3px',\n padding: '0 4px',\n }}\n >\n caused\n </span>\n )}\n </div>\n )\n}\n\nexport function EpisodeMemberList({ members }: { members: EpisodeMember[] }) {\n if (members.length === 0) return <span style={{ color: '#555' }}>—</span>\n return (\n <>\n {members.map((m, i) => (\n <EpisodeMemberRow key={i} member={m} />\n ))}\n </>\n )\n}\n","import { h } from 'preact'\nimport { correlate } from '@react-perfscope/core'\nimport type { Signal, Episode } from '@react-perfscope/core'\nimport { useI18n } from './i18n'\nimport { EpisodeMemberList } from './episode-shared'\n\n/** Picks the long-task-anchored episode with the longest duration — the worst\n * single block of main-thread time in the recording. */\nfunction worstLongTaskEpisode(signals: Signal[]): Episode | null {\n let worst: Episode | null = null\n for (const ep of correlate(signals)) {\n if (ep.anchor.kind !== 'long-task') continue\n if (!worst || ep.anchor.duration > worst.anchor.duration) worst = ep\n }\n return worst\n}\n\nexport function LongTaskEpisode({ signals }: { signals: Signal[] }) {\n const { t } = useI18n()\n const episode = worstLongTaskEpisode(signals)\n if (!episode || episode.anchor.kind !== 'long-task') return null\n // With no members there's nothing to correlate — the raw signal list below\n // already shows the task on its own, so skip the (empty) episode card.\n if (episode.members.length === 0) return null\n const a = episode.anchor\n\n return (\n <div\n data-long-task-episode\n style={{\n margin: '0 0 8px',\n border: '1px solid #1f1f1f',\n borderRadius: '6px',\n background: '#121212',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n overflow: 'hidden',\n }}\n >\n <div style={{ padding: '6px 8px', borderBottom: '1px solid #1f1f1f', color: '#ddd' }}>\n <strong>{t.kindLabel('long-task')}</strong> — <strong>{Math.round(a.duration)}ms</strong>\n </div>\n <div style={{ padding: '5px 8px' }}>\n <EpisodeMemberList members={episode.members} />\n </div>\n </div>\n )\n}\n","import type { Signal } from '@react-perfscope/core'\n\n/**\n * Lowercased, human-readable text for a signal, used for substring filtering\n * in the panel. Covers the fields a developer would actually search by:\n * component names, request URLs, metric names, source functions/files.\n */\nexport function signalSearchText(signal: Signal): string {\n switch (signal.kind) {\n case 'render': {\n const parts = [signal.component]\n if (signal.changedProps) parts.push(...signal.changedProps)\n if (signal.members) for (const m of signal.members) parts.push(m.component)\n return parts.join(' ').toLowerCase()\n }\n case 'network':\n return signal.url.toLowerCase()\n case 'web-vital':\n return signal.name.toLowerCase()\n case 'interaction':\n return [signal.eventType, signal.target ?? ''].join(' ').toLowerCase()\n case 'forced-reflow': {\n const f = signal.stack[0]\n return f ? [f.fnName ?? '', f.file].join(' ').toLowerCase() : ''\n }\n case 'long-task': {\n const parts: string[] = []\n if (signal.scripts)\n for (const s of signal.scripts) parts.push(s.sourceFunctionName, s.invoker, s.sourceURL)\n if (signal.attribution)\n for (const a of signal.attribution) parts.push(a.frame.fnName ?? '', a.frame.file)\n return parts.join(' ').toLowerCase()\n }\n case 'layout-shift':\n return 'layout-shift'\n default:\n return ''\n }\n}\n\n/** Whether a signal matches a free-text filter query. Empty query matches all. */\nexport function signalMatchesFilter(signal: Signal, query: string): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return true\n return signalSearchText(signal).includes(q)\n}\n","import { h } from 'preact'\nimport { App } from './app'\nimport { mountShadow } from './shadow-mount'\nimport type { MountOptions, UnmountFn } from './types'\n\nexport function mount(opts: MountOptions): UnmountFn {\n const { recorder, position = 'bottom-right', host = document.body, resolveFrame, finalize } = opts\n return mountShadow(\n <App recorder={recorder} position={position} resolveFrame={resolveFrame} finalize={finalize} />,\n { parent: host }\n )\n}\n"],"mappings":";AAAA,SAAS,cAAmC;AAE5C,IAAM,cAAc;AAKpB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCf,SAAS,YAAY,OAAuB,OAA2B,CAAC,GAAe;AAC5F,QAAM,SAAS,KAAK,UAAU,SAAS;AACvC,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,aAAa,aAAa,EAAE;AACjC,QAAM,OAAO,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAC/C,SAAO,YAAY,IAAI;AACvB,SAAO,OAAO,IAA0B;AAIxC,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,cAAc;AACpB,OAAK,YAAY,KAAK;AAEtB,MAAI,OAAO;AACX,SAAO,MAAM;AACX,QAAI,KAAM;AACV,WAAO;AACP,QAAI;AACF,aAAO,MAAM,IAA0B;AAAA,IACzC,QAAQ;AAAA,IAER;AACA,QAAI,KAAK,WAAY,MAAK,WAAW,YAAY,IAAI;AAAA,EACvD;AACF;;;ACtEA,SAAS,YAAAA,WAAU,UAAAC,SAAQ,aAAAC,kBAAiB;;;ACD5C,SAAS,GAAG,qBAA6C;AACzD,SAAS,YAAY,UAAU,aAAa,eAAe;AAKpD,IAAM,cAAc;AA2G3B,IAAM,KAAc;AAAA,EAClB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,MAAM;AAAA,EACN,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,eAAe;AAAA,EACf,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa,CAAC,MAAM,GAAG,CAAC;AAAA,EACxB,WAAW,CAAC,MAAM,KAAK,CAAC;AAAA,EACxB,gBAAgB,CAAC,MAAM,GAAG,CAAC;AAAA,EAC3B,mBAAmB,CAAC,MAAM,GAAG,CAAC;AAAA,EAC9B,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,KAAK;AAAA,EACL,cAAc,CAAC,GAAG,SAAS,GAAG,CAAC,IAAI,IAAI;AAAA,EACvC,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,mBACE;AAAA,EACF,gBAAgB,CAAC,QACf,QAAQ,mBAAmB,mBAAmB,QAAQ,YAAY,YAAY;AAAA,EAChF,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,UAAU,CAAC,QAAQ,YAAY,OAAO,MAAM,YAAS,OAAO;AAAA,EAC5D,UAAU,CAAC,OAAO,SAAS,EAAE;AAAA,EAC7B,cAAc;AAAA,EACd,gBAAgB,CAAC,MAAM,KAAK,CAAC,kBAAkB,MAAM,IAAI,KAAK,GAAG;AAAA,EACjE,gBAAgB,CAAC,GAAG,GAAG,OAAO,QAC5B,GAAG,CAAC,SAAM,CAAC,uBAAoB,MAAM,QAAQ,CAAC,CAAC,eAAY,IAAI,QAAQ,CAAC,CAAC;AAAA,EAC3E,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa,CAAC,WAAW,WAAW,MAAM;AAAA,EAC1C,eAAe,CAAC,QAAQ,aAAa,GAAG;AAAA,EACxC,YAAY,CAAC,QAAQ,UAAU,GAAG;AAAA,EAClC,WAAW,CAAC,SAAS;AAAA,EACrB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,oBAAoB,CAAC,MAAM,GAAG,CAAC,sBAAsB,MAAM,IAAI,KAAK,GAAG;AAAA,EACvE,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,0BAA0B;AAAA,EAC1B,iBAAiB;AACnB;AAEA,IAAM,iBAA6C;AAAA,EACjD,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AACf;AAEA,IAAM,KAAc;AAAA,EAClB,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,MAAM;AAAA,EACN,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,eAAe;AAAA,EACf,SAAS;AAAA,EACT,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa,CAAC,MAAM,gBAAM,CAAC;AAAA,EAC3B,WAAW,CAAC,MAAM,UAAK,CAAC;AAAA,EACxB,gBAAgB,CAAC,MAAM,gBAAM,CAAC;AAAA,EAC9B,mBAAmB,CAAC,MAAM,4BAAQ,CAAC;AAAA,EACnC,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,KAAK;AAAA,EACL,cAAc,CAAC,GAAG,SAAS,GAAG,IAAI,uBAAQ,CAAC;AAAA,EAC3C,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,mBACE;AAAA,EACF,gBAAgB,CAAC,QACf,QAAQ,mBAAmB,8BAAU,QAAQ,YAAY,wBAAS;AAAA,EACpE,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,UAAU,CAAC,QAAQ,YAAY,gBAAM,MAAM,yBAAY,OAAO;AAAA,EAC9D,UAAU,CAAC,OAAO,gBAAM,EAAE;AAAA,EAC1B,cAAc;AAAA,EACd,gBAAgB,CAAC,MAAM,mCAAU,CAAC;AAAA,EAClC,gBAAgB,CAAC,GAAG,GAAG,OAAO,QAC5B,GAAG,CAAC,sBAAS,CAAC,sBAAS,MAAM,QAAQ,CAAC,CAAC,wBAAW,IAAI,QAAQ,CAAC,CAAC;AAAA,EAClE,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa,CAAC,WAAW,iBAAO,MAAM;AAAA,EACtC,eAAe,CAAC,QAAQ,uBAAQ,GAAG;AAAA,EACnC,YAAY,CAAC,QAAQ,8BAAU,GAAG;AAAA,EAClC,WAAW,CAAC,SAAS,eAAe,IAAI;AAAA,EACxC,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,oBAAoB,CAAC,MAAM,+CAAY,CAAC;AAAA,EACxC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,0BAA0B;AAAA,EAC1B,iBAAiB;AACnB;AAEO,IAAM,UAAiC,EAAE,IAAI,GAAG;AAEvD,SAAS,OAAO,GAAuB;AACrC,SAAO,MAAM,QAAQ,MAAM;AAC7B;AAEO,SAAS,iBAAuB;AACrC,MAAI,OAAO,iBAAiB,YAAa,QAAO;AAChD,MAAI;AACF,UAAM,IAAI,aAAa,QAAQ,WAAW;AAC1C,WAAO,OAAO,CAAC,IAAI,IAAI;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUA,IAAM,cAAc,cAAyB;AAAA,EAC3C,MAAM;AAAA,EACN,SAAS,MAAM;AAAA,EAAC;AAAA,EAChB,GAAG;AACL,CAAC;AAEM,SAAS,aAAa,EAAE,SAAS,GAAoC;AAC1E,QAAM,CAAC,MAAM,YAAY,IAAI,SAAe,MAAM,eAAe,CAAC;AAClE,QAAM,UAAU,YAAY,CAAC,MAAY;AACvC,iBAAa,CAAC;AACd,QAAI,OAAO,iBAAiB,aAAa;AACvC,UAAI;AACF,qBAAa,QAAQ,aAAa,CAAC;AAAA,MACrC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AACL,QAAM,QAAQ,QAAmB,OAAO,EAAE,MAAM,SAAS,GAAG,QAAQ,IAAI,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC;AAC7F,SAAO,EAAE,YAAY,UAAU,EAAE,MAAM,GAAG,QAAQ;AACpD;AAEO,SAAS,UAAqB;AACnC,SAAO,WAAW,WAAW;AAC/B;;;ACpTM,SAmBE,KAnBF;AA9BN,IAAM,kBAAkE;AAAA,EACtE,gBAAgB,EAAE,QAAQ,QAAQ,OAAO,OAAO;AAAA,EAChD,eAAe,EAAE,QAAQ,QAAQ,MAAM,OAAO;AAAA,EAC9C,aAAa,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC1C,YAAY,EAAE,KAAK,QAAQ,MAAM,OAAO;AAC1C;AAEA,SAAS,cAAc,IAAoB;AACzC,QAAM,eAAe,KAAK,MAAM,KAAK,GAAI;AACzC,QAAM,UAAU,KAAK,MAAM,eAAe,EAAE;AAC5C,QAAM,UAAU,eAAe,UAAU;AACzC,SAAO,GAAG,OAAO,IAAI,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAC1D;AAEO,SAAS,OAAO,OAAoB;AACzC,QAAM,EAAE,WAAW,YAAY,GAAG,UAAU,WAAW,eAAe,IAAI;AAC1E,QAAM,gBAAgB,gBAAgB,QAAQ;AAC9C,QAAM,EAAE,EAAE,IAAI,QAAQ;AAEtB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe;AAAA,MACf,OAAO;AAAA,QACL,UAAU;AAAA,QACV,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,YACE;AAAA,MACJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,gBAAc;AAAA,UACd,cAAY,YAAY,EAAE,gBAAgB,EAAE;AAAA,UAC5C,SAAS;AAAA,UACT,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,SAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,YACL,WAAW;AAAA,UACb;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY,YAAY,YAAY;AAAA,kBACpC,SAAS;AAAA,gBACX;AAAA;AAAA,YACF;AAAA,YACA,oBAAC,UAAK,aAAU,UACb,sBAAY,cAAc,SAAS,IAAI,EAAE,KAC5C;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AC1EA,SAAS,YAAAC,WAAU,WAAAC,UAAS,WAAW,UAAAC,eAAc;;;ACDrD,IAAM,iBAAiB;AACvB,IAAM,eAAe;AACrB,IAAM,UAAU;AAEhB,IAAM,iBAAiB;AACvB,IAAM,eAAe;AAWrB,SAAS,YAAY,IAAyB;AAC5C,QAAM,WAAW,SAAS,cAAc,IAAI,cAAc,KAAK,EAAE,IAAI;AACrE,MAAI,SAAU,QAAO;AACrB,QAAM,KAAK,SAAS,cAAc,KAAK;AACvC,KAAG,aAAa,gBAAgB,EAAE;AAIlC,KAAG,MAAM,WAAW;AACpB,KAAG,MAAM,gBAAgB;AACzB,KAAG,MAAM,YAAY;AACrB,KAAG,MAAM,SAAS,aAAa,cAAc;AAC7C,KAAG,MAAM,aAAa;AACtB,KAAG,MAAM,SAAS;AAClB,KAAG,MAAM,eAAe;AACxB,KAAG,MAAM,aAAa,WAAW,OAAO;AACxC,WAAS,KAAK,YAAY,EAAE;AAC5B,SAAO;AACT;AAEO,SAAS,YAAY,IAAY,MAAe,OAA4B;AACjF,QAAM,KAAK,YAAY,EAAE;AACzB,KAAG,MAAM,OAAO,GAAG,KAAK,IAAI;AAC5B,KAAG,MAAM,MAAM,GAAG,KAAK,GAAG;AAC1B,KAAG,MAAM,QAAQ,GAAG,KAAK,KAAK;AAC9B,KAAG,MAAM,SAAS,GAAG,KAAK,MAAM;AAChC,KAAG,MAAM,UAAU;AACnB,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,OAAO,OAAO,QAAQ;AAC5B,KAAG,MAAM,cAAc,OAAO,SAAS,WAAW;AAClD,KAAG,MAAM,cAAc;AACvB,KAAG,MAAM,aAAa;AACxB;AAQO,SAAS,UACd,IACA,MACA,IACA,QAAgB,gBACV;AAEN,MAAI,MAAM,SAAS,cAAc,IAAI,YAAY,KAAK,EAAE,IAAI;AAC5D,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,gBAAgB,8BAA8B,KAAK;AAClE,QAAI,aAAa,cAAc,EAAE;AACjC,QAAI,MAAM,WAAW;AACrB,QAAI,MAAM,gBAAgB;AAC1B,QAAI,MAAM,WAAW;AACrB,QAAI,MAAM,SAAS;AACnB,QAAI,MAAM,aAAa,WAAW,OAAO;AACzC,aAAS,KAAK,YAAY,GAAG;AAAA,EAC/B;AAEA,QAAM,OAAO,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC;AAClC,QAAM,OAAO,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC;AAClC,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC;AAC7C,QAAMC,KAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC;AAC7C,MAAI,MAAM,OAAO,GAAG,IAAI;AACxB,MAAI,MAAM,MAAM,GAAG,IAAI;AACvB,MAAI,aAAa,SAAS,GAAG,CAAC,EAAE;AAChC,MAAI,aAAa,UAAU,GAAGA,EAAC,EAAE;AACjC,MAAI,aAAa,WAAW,OAAO,CAAC,IAAIA,EAAC,EAAE;AAC3C,MAAI,MAAM,UAAU;AAEpB,SAAO,IAAI,WAAY,KAAI,YAAY,IAAI,UAAU;AAErD,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,KAAK,GAAG,IAAI;AAClB,QAAM,KAAK,GAAG,IAAI;AAElB,QAAM,WAAW,uBAAuB,EAAE;AAC1C,QAAM,OAAO,SAAS,gBAAgB,8BAA8B,MAAM;AAC1E,QAAM,SAAS,SAAS,gBAAgB,8BAA8B,QAAQ;AAC9E,SAAO,aAAa,MAAM,QAAQ;AAClC,SAAO,aAAa,WAAW,WAAW;AAC1C,SAAO,aAAa,QAAQ,GAAG;AAC/B,SAAO,aAAa,QAAQ,GAAG;AAC/B,SAAO,aAAa,eAAe,GAAG;AACtC,SAAO,aAAa,gBAAgB,GAAG;AACvC,SAAO,aAAa,UAAU,oBAAoB;AAClD,QAAM,YAAY,SAAS,gBAAgB,8BAA8B,MAAM;AAC/E,YAAU,aAAa,KAAK,uBAAuB;AACnD,YAAU,aAAa,QAAQ,KAAK;AACpC,SAAO,YAAY,SAAS;AAC5B,OAAK,YAAY,MAAM;AACvB,MAAI,YAAY,IAAI;AAEpB,QAAM,OAAO,SAAS,gBAAgB,8BAA8B,MAAM;AAC1E,OAAK,aAAa,MAAM,GAAG,EAAE,EAAE;AAC/B,OAAK,aAAa,MAAM,GAAG,EAAE,EAAE;AAC/B,OAAK,aAAa,MAAM,GAAG,EAAE,EAAE;AAC/B,OAAK,aAAa,MAAM,GAAG,EAAE,EAAE;AAC/B,OAAK,aAAa,UAAU,KAAK;AACjC,OAAK,aAAa,gBAAgB,GAAG;AACrC,OAAK,aAAa,kBAAkB,OAAO;AAC3C,OAAK,aAAa,cAAc,QAAQ,QAAQ,GAAG;AACnD,MAAI,YAAY,IAAI;AACtB;AAEO,SAAS,UAAU,IAAkB;AAC1C,QAAM,MAAM,SAAS,cAAc,IAAI,YAAY,KAAK,EAAE,IAAI;AAC9D,MAAI,IAAK,KAAI,OAAO;AACtB;AAOO,SAAS,YAAY,IAAkB;AAC5C,QAAM,KAAK,SAAS,cAAc,IAAI,cAAc,KAAK,EAAE,IAAI;AAC/D,MAAI,CAAC,GAAI;AACT,KAAG,MAAM,UAAU;AACnB,aAAW,MAAM;AAEf,UAAM,aAAa,SAAS,cAAc,IAAI,cAAc,KAAK,EAAE,IAAI;AACvE,QAAI,cAAe,WAA2B,MAAM,YAAY,KAAK;AACnE,iBAAW,OAAO;AAAA,IACpB;AAAA,EACF,GAAG,UAAU,EAAE;AACjB;AAMO,SAAS,kBAAwB;AACtC,aAAW,MAAM,MAAM,KAAK,SAAS,iBAAiB,IAAI,cAAc,GAAG,CAAC,GAAG;AAC7E,OAAG,OAAO;AAAA,EACZ;AACA,aAAW,MAAM,MAAM,KAAK,SAAS,iBAAiB,IAAI,YAAY,GAAG,CAAC,GAAG;AAC3E,OAAG,OAAO;AAAA,EACZ;AACF;;;ACvJO,IAAM,iBAA2C;AAAA,EACtD,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR;AASO,IAAM,yBAAmD;AAAA,EAC9D,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR;AAEO,IAAM,eAAuC;AAAA,EAClD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,uBAAyE;AAAA,EAC7E,KAAK,CAAC,MAAM,GAAI;AAAA,EAChB,KAAK,CAAC,KAAK,GAAG;AAAA,EACd,KAAK,CAAC,KAAK,IAAI;AAAA,EACf,KAAK,CAAC,MAAM,GAAI;AAAA,EAChB,MAAM,CAAC,KAAK,IAAI;AAClB;AAEO,SAAS,eAAe,MAA8B,OAAuB;AAClF,QAAM,CAAC,MAAM,KAAK,IAAI,qBAAqB,IAAI;AAC/C,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,SAAS,MAAO,QAAO;AAC3B,SAAO;AACT;AAEA,IAAM,gBAA0C,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,EAAE;AAGtE,SAAS,kBAAkB,GAAqB;AACrD,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,UAAI,EAAE,YAAY,IAAK,QAAO;AAC9B,UAAI,EAAE,YAAY,GAAI,QAAO;AAC7B,aAAO;AAAA,IACT,KAAK;AACH,UAAI,EAAE,YAAY,GAAI,QAAO;AAC7B,UAAI,EAAE,YAAY,EAAG,QAAO;AAC5B,aAAO;AAAA,IACT,KAAK;AACH,UAAI,EAAE,SAAS,IAAK,QAAO;AAC3B,UAAI,EAAE,SAAS,KAAM,QAAO;AAC5B,aAAO;AAAA,IACT,KAAK;AAEH,UAAI,EAAE,YAAY,GAAI,QAAO;AAC7B,UAAI,EAAE,YAAY,GAAI,QAAO;AAC7B,aAAO;AAAA,IACT,KAAK;AACH,UAAI,EAAE,YAAY,EAAE,YAAY,IAAK,QAAO;AAC5C,UAAI,EAAE,YAAY,IAAM,QAAO;AAC/B,UAAI,EAAE,YAAY,IAAK,QAAO;AAC9B,aAAO;AAAA,IACT,KAAK,aAAa;AAChB,YAAM,SAAS,eAAe,EAAE,MAAM,EAAE,KAAK;AAC7C,aAAO,WAAW,SAAS,SAAS,WAAW,UAAU,WAAW;AAAA,IACtE;AAAA,IACA,KAAK;AAEH,UAAI,EAAE,YAAY,IAAK,QAAO;AAC9B,UAAI,EAAE,YAAY,IAAK,QAAO;AAC9B,aAAO;AAAA,EACX;AACF;AAEO,SAAS,cAAc,SAA6B;AACzD,MAAI,QAAkB;AACtB,aAAW,KAAK,SAAS;AACvB,UAAM,MAAM,kBAAkB,CAAC;AAC/B,QAAI,cAAc,GAAG,IAAI,cAAc,KAAK,EAAG,SAAQ;AAAA,EACzD;AACA,SAAO;AACT;AAEO,SAAS,aAAa,KAAuB;AAClD,SAAO,cAAc,GAAG;AAC1B;;;AChDM,gBAAAC,MAWA,QAAAC,aAXA;AAnCN,IAAM,iBAAyD;AAAA,EAC7D,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AACR;AAEA,SAAS,iBAAiB,MAA8B,OAAuB;AAC7E,MAAI,SAAS,MAAO,QAAO,MAAM,QAAQ,CAAC;AAC1C,MAAI,SAAS,IAAM,SAAQ,QAAQ,KAAM,QAAQ,CAAC,IAAI;AACtD,SAAO,MAAM,QAAQ,CAAC;AACxB;AAEA,SAAS,UAAU,EAAE,EAAE,GAA0B;AAC/C,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,SAAS,eAAe,EAAE,MAAM,EAAE,KAAK;AAC7C,QAAM,QAAQ,aAAa,MAAM;AACjC,QAAM,OAAO,eAAe,EAAE,IAAI;AAClC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE;AAAA,MACd,eAAa;AAAA,MACb,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,QAAQ,aAAa,KAAK;AAAA,QAC1B,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,EAAE,YAAY,MAAM;AAAA,YAChC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,MAAM;AAAA,YACR;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA,KAAC,YAAO,OAAO,EAAE,OAAO,UAAU,GAAI,YAAE,MAAK;AAAA,QAC7C,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,GAClB;AAAA,2BAAiB,EAAE,MAAM,EAAE,KAAK;AAAA,UAChC,SAAS,MAAM,OAAO;AAAA,WACzB;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,cAAc,EAAE,SAAS,SAAS,cAAc,YAAY,GAAuB;AACjG,QAAM,EAAE,EAAE,IAAI,QAAQ;AAGtB,QAAM,eAAe,oBAAI,IAA4C;AACrE,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS,YAAa,cAAa,IAAI,EAAE,MAAM,CAAC;AAAA,EACxD;AACA,QAAM,SAAS,MAAM,KAAK,aAAa,OAAO,CAAC;AAC/C,QAAM,gBAAgB,aAAa,OAAO,CAAC,MAAM,MAAM,WAAW;AAElE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,MACP;AAAA,MAEC;AAAA,eAAO,SAAS,KACf,gBAAAD,KAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,MAAM,GACzD,iBAAO,IAAI,CAAC,MACX,gBAAAA,KAAC,aAAuB,GAAG,KAAX,EAAE,IAAY,CAC/B,GACH;AAAA,QAED,cAAc,SAAS,KACtB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,KAAK;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,YAAY;AAAA,YACd;AAAA,YAEC,wBAAc,IAAI,CAAC,MAAM;AACxB,oBAAM,OAAO,QAAQ,CAAC;AACtB,oBAAM,MAAM,cAAc,IAAI;AAC9B,oBAAM,QAAQ,QAAQ,QAAQ,SAAS,eAAe,GAAG;AACzD,qBACE,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBAEC,qBAAmB;AAAA,kBACnB,SAAS,MAAM,cAAc,CAAC;AAAA,kBAC9B,OAAO;AAAA,oBACL,QAAQ,cAAc,YAAY;AAAA,oBAClC,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,kBACP;AAAA,kBACA,OAAO,EAAE,aAAa,KAAK,QAAQ,EAAE,UAAU,CAAC,CAAC;AAAA,kBAEhD;AAAA,4BAAQ,SACP,gBAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,cAAc;AAAA,0BACd,YAAY;AAAA,0BACZ,MAAM;AAAA,wBACR;AAAA;AAAA,oBACF;AAAA,oBAEF,gBAAAA,KAAC,UAAM,YAAE,UAAU,CAAC,GAAE;AAAA,oBACtB,gBAAAA,KAAC,YAAO,OAAO,EAAE,MAAM,GAAI,eAAK,QAAO;AAAA;AAAA;AAAA,gBAvBlC;AAAA,cAwBP;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACjJA,SAAY,gBAAgB;AAC5B,SAAS,iBAAiB,WAAAE,UAAS,QAAQ,YAAAC,iBAAgB;AAE3D,SAAS,kBAAkB,qBAAqB;AA+VxC,SAGI,OAAAC,MAHJ,QAAAC,aAAA;AA7UR,IAAM,aAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,mBAAmB,GAA0B;AACpD,MAAI,EAAE,SAAS,YAAa,QAAO;AACnC,MAAI,EAAE,SAAS,UAAW,QAAO,EAAE;AACnC,SAAO,EAAE;AACX;AAEA,SAAS,eAAe,GAAmB;AACzC,MACE,EAAE,SAAS,eACX,EAAE,SAAS,mBACX,EAAE,SAAS,YACX,EAAE,SAAS,aACX,EAAE,SAAS,eACX;AACA,WAAO,EAAE;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,WAAW,IAAoB;AACtC,MAAI,MAAM,IAAM,QAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAChD,MAAI,MAAM,EAAG,QAAO,GAAG,GAAG,QAAQ,CAAC,CAAC;AACpC,SAAO,GAAG,GAAG,QAAQ,CAAC,CAAC;AACzB;AAEA,SAAS,SAAS,MAAc,QAAwB;AACtD,QAAM,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI;AAChC,QAAM,MAAM,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC;AACpD,QAAM,OAAO,MAAM;AACnB,MAAI,OAAO,IAAK,QAAO,IAAI;AAC3B,MAAI,OAAO,EAAG,QAAO,IAAI;AACzB,MAAI,OAAO,EAAG,QAAO,IAAI;AACzB,SAAO,KAAK;AACd;AAGA,SAAS,UAAU,OAAe,KAAa,SAAS,GAAa;AACnE,QAAM,OAAO,KAAK,IAAI,MAAM,OAAO,CAAC;AACpC,QAAM,OAAO,SAAS,MAAM,MAAM;AAClC,QAAM,QAAQ,KAAK,KAAK,QAAQ,IAAI,IAAI;AACxC,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,OAAO,KAAK,MAAM,MAAM,KAAK,KAAM,OAAM,KAAK,CAAC;AAC5D,SAAO;AACT;AAEA,IAAM,cAAc;AAIpB,IAAM,YAAY;AAClB,IAAM,cAAc;AAGpB,IAAM,qBAAqB,CAAC,GAAG,MAAM,MAAM,KAAK,IAAI;AAGpD,IAAM,kBAAkB;AACxB,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,YAAY;AAClB,IAAM,WAAW;AAIjB,IAAM,iBAAiB;AAIvB,IAAM,iBAAiB;AAUvB,SAAS,SACP,SACA,MACA,UACA,QACA,WACW;AACX,QAAM,OAAO,KAAK,IAAI,SAAS,UAAU,CAAC;AAC1C,QAAM,MAAiB,CAAC;AACxB,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS,KAAM;AACrB,UAAM,OAAO,mBAAmB,CAAC;AACjC,QAAI,QAAQ,KAAM;AAClB,UAAM,IAAI,OAAO,YAAY;AAC7B,UAAM,IAAI,eAAe,CAAC;AAC1B,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC;AACnD,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,WAAW,IAAI,IAAI,CAAC;AAC/D,QAAI,KAAK,EAAE,GAAG,WAAW,UAAU,CAAC;AAAA,EACtC;AACA,SAAO;AACT;AAOA,SAAS,SAAS,MAAiB,cAA4D;AAC7F,QAAM,SAAS;AACf,QAAM,UAAoB,CAAC;AAC3B,QAAM,OAAiB,CAAC;AACxB,aAAW,KAAK,MAAM;AACpB,UAAM,UAAU,EAAE,YAAY;AAC9B,UAAM,QAAQ,UAAU,KAAK,IAAI,WAAW,EAAE,YAAY,YAAY;AACtE,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAI,WAAW,QAAQ,CAAC,IAAK,QAAQ;AACnC,iBAAS;AACT;AAAA,MACF;AAAA,IACF;AACA,QAAI,WAAW,IAAI;AACjB,eAAS,QAAQ;AACjB,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,IAAI;AAClB,SAAK,KAAK,MAAM;AAAA,EAClB;AACA,SAAO,EAAE,MAAM,UAAU,KAAK,IAAI,GAAG,QAAQ,MAAM,EAAE;AACvD;AAGA,IAAM,WAAqC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,EAAE;AAoBxE,SAAS,YAAY,OAAkB,SAAgE;AACrG,QAAM,OAAkB,CAAC;AACzB,QAAM,MAAiB,CAAC;AACxB,aAAW,MAAM,OAAO;AACtB,QAAI,GAAG,aAAa,QAAS,MAAK,KAAK,EAAE;AAAA,QACpC,KAAI,KAAK,EAAE;AAAA,EAClB;AACA,MAAI,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAC5C,QAAM,WAA2B,CAAC;AAClC,MAAI,IAAI;AACR,SAAO,IAAI,IAAI,QAAQ;AACrB,UAAM,QAAQ,IAAI,CAAC,EAAG;AACtB,QAAI,MAAM,IAAI,CAAC,EAAG;AAClB,QAAI,QAAQ,kBAAkB,IAAI,CAAC,EAAG,CAAC;AACvC,QAAI,MAAM;AACV,QAAI,IAAI;AACR,UAAM,UAAoB,CAAC;AAC3B,WAAO,IAAI,IAAI,UAAU,IAAI,CAAC,EAAG,YAAY,SAAS,SAAS;AAC7D,YAAM,MAAM,kBAAkB,IAAI,CAAC,EAAG,CAAC;AACvC,UAAI,SAAS,GAAG,IAAI,SAAS,KAAK,GAAG;AACnC,gBAAQ;AACR,cAAM,IAAI,CAAC,EAAG;AAAA,MAChB;AACA,cAAQ,KAAK,IAAI,CAAC,EAAG,CAAC;AACtB,aAAO,IAAI,CAAC,EAAG;AACf;AAAA,IACF;AACA,aAAS,KAAK,EAAE,WAAW,MAAM,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,KAAK,OAAO,QAAQ,CAAC;AAC7F,QAAI;AAAA,EACN;AACA,SAAO,EAAE,MAAM,SAAS;AAC1B;AAKA,SAAS,gBAAgB,SAA2D;AAClF,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS,SAAU;AAGzB,eAAW,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG;AAChC,UAAI,CAAC,OAAO,IAAI,EAAE,SAAS,EAAG,OAAM,KAAK,EAAE,SAAS;AACpD,aAAO,IAAI,EAAE,YAAY,OAAO,IAAI,EAAE,SAAS,KAAK,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF;AACA,SAAO,MAAM,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,OAAO,IAAI,CAAC,EAAG,EAAE;AACnE;AAEA,IAAM,eAAe;AAGrB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,mBAAmD;AAAA,EACvD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,kBAAkB;AACpB;AAEA,SAAS,YAAY,GAAmB;AACtC,MAAI,KAAK,OAAO,KAAM,QAAO,IAAI,KAAK,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9D,MAAI,KAAK,KAAM,QAAO,IAAI,IAAI,MAAM,QAAQ,CAAC,CAAC;AAC9C,SAAO,GAAG,CAAC;AACb;AAIA,SAAS,eACP,SACA,WACA,SACiE;AACjE,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI,KAAK;AACT,MAAI,KAAK;AACT,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,OAAO,GAAI,MAAK,EAAE;AACxB,QAAI,EAAE,OAAO,GAAI,MAAK,EAAE;AAAA,EAC1B;AACA,QAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,CAAC;AACjC,QAAM,MAAM,QAAQ,IAAI,CAAC,MAAM;AAC7B,UAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,YAAa,EAAE,KAAK,aAAa,UAAW,SAAS,CAAC;AACrF,UAAM,IAAI,aAAc,EAAE,OAAO,MAAM,QAAS;AAChD,WAAO,EAAE,GAAG,EAAE;AAAA,EAChB,CAAC;AACD,QAAM,OAAO,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AACpG,QAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,QAAM,QAAQ,IAAI,CAAC;AACnB,QAAM,OAAO,GAAG,IAAI,KAAK,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,SAAS,KAAK,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,SAAS;AAC3F,SAAO,EAAE,MAAM,MAAM,KAAK,IAAI,KAAK,GAAG;AACxC;AAEA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,MAAM,CAAC,CAAC,WAAW,QAAQ,SAAS;AAC1C,QAAM,QAAQC,SAAQ,MAAO,MAAM,iBAAiB,OAAQ,IAAI,MAAO,CAAC,SAAS,GAAG,CAAC;AACrF,QAAM,QAAQA;AAAA,IACZ,MAAO,MAAM,eAAe,SAAU,WAAW,OAAO,IAAI;AAAA,IAC5D,CAAC,SAAS,KAAK,WAAW,OAAO;AAAA,EACnC;AACA,QAAM,QAAQ,QAAQ,iBAAiB,MAAM,cAAc,IAAI;AAK/D,QAAM,CAAC,YAAY,aAAa,IAAIC;AAAA,IAClC;AAAA,EACF;AACA,QAAM,UAAU,OAA8B,IAAI;AAClD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA+C,IAAI;AAEjF,kBAAgB,MAAM;AACpB,QAAI,CAAC,YAAY;AACf,iBAAW,IAAI;AACf;AAAA,IACF;AACA,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,GAAI;AACT,UAAM,IAAI,GAAG,sBAAsB;AACnC,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,OAAO;AAClB,UAAM,MAAM;AACZ,QAAI,OAAO,WAAW;AACtB,QAAI,OAAO,EAAE,QAAQ,IAAI,GAAI,QAAO,KAAK,EAAE,QAAQ;AACnD,QAAI,OAAO,EAAG,QAAO;AACrB,QAAI,MAAM,WAAW,SAAS;AAC9B,QAAI,MAAM,EAAE,SAAS,IAAI,GAAI,OAAM,WAAW,MAAM,EAAE,SAAS;AAC/D,QAAI,MAAM,EAAG,OAAM;AACnB,eAAW,EAAE,MAAM,IAAI,CAAC;AAAA,EAC1B,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,mBAAgB;AAAA,MAChB,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ,GAAG,YAAY;AAAA,QACvB,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,MAAM,OAAO,eAAe;AAAA,cAC5B,UAAU;AAAA,cACV,WAAW;AAAA,cACX,UAAU;AAAA,cACV,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,eAAe;AAAA,cACf,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,aAAa;AAAA,cACb,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAA,MAAC,UAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,OAAO,OAAO,UAAU,GAChF;AAAA,kBAAE;AAAA,gBACF,OACC,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,kBAAe;AAAA,oBACf,cAAY,EAAE;AAAA,oBACd,cAAc,CAAC,MAAM;AACnB,4BAAM,IAAK,EAAE,cAA8B,sBAAsB;AACjE,oCAAc,EAAE,MAAM,EAAE,MAAM,KAAK,EAAE,KAAK,QAAQ,EAAE,OAAO,CAAC;AAAA,oBAC9D;AAAA,oBACA,cAAc,MAAM,cAAc,IAAI;AAAA,oBACtC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,QAAQ;AAAA,sBACR,OAAO;AAAA,sBACP,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,QAAQ;AAAA,oBACV;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,iBAEJ;AAAA,cACC,OAAO,SACN,gBAAAC,MAAC,UAAK,mBAAiB,MAAM,gBAAgB,OAAO,EAAE,OAAO,UAAU,OAAO,GAC3E;AAAA,kBAAE,eAAe,MAAM,cAAc;AAAA,gBACrC,MAAM,mBAAmB,YACxB,WAAQ,MAAM,oBAAoB,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,iBAC9D;AAAA;AAAA;AAAA,QAEJ;AAAA,QACA,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,MAAM,UAAU,aAAa;AAAA,cAC7B,OAAO,UAAU,GAAG,UAAU,OAAO;AAAA,cACrC,UAAU;AAAA,cACV,SAAS,KAAK,WAAW;AAAA,YAC3B;AAAA,YAEC,iBAAO,QACN,gBAAAC,MAAC,YACC;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAM;AAAA,kBACN,QAAQ;AAAA,kBACR,SAAS,OAAO,SAAS,IAAI,SAAS;AAAA,kBACtC,qBAAoB;AAAA,kBACpB,OAAO,EAAE,SAAS,QAAQ;AAAA,kBAC1B,eAAY;AAAA,kBAEZ;AAAA,oCAAAD,KAAC,UAAK,GAAG,MAAM,MAAM,MAAM,OAAO,aAAa,MAAM;AAAA,oBACrD,gBAAAA,KAAC,UAAK,GAAG,MAAM,MAAM,MAAK,QAAO,QAAQ,OAAO,aAAa,KAAK,cAAa,sBAAqB;AAAA;AAAA;AAAA,cACtG;AAAA,cACA,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,KAAK;AAAA,oBACL,OAAO;AAAA,oBACP,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,eAAe;AAAA,kBACjB;AAAA,kBAEC;AAAA,gCAAY,MAAM,GAAG;AAAA,oBAAE;AAAA,oBAAE,YAAY,MAAM,GAAG;AAAA;AAAA;AAAA,cACjD;AAAA,eACF,IAEA,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,MAAM;AAAA,kBACN,WAAW;AAAA,kBACX,OAAO;AAAA,kBACP,UAAU;AAAA,gBACZ;AAAA,gBAEC,YAAE;AAAA;AAAA,YACL;AAAA;AAAA,QAEJ;AAAA,QACC,cACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,OAAO;AAAA,cACL,UAAU;AAAA,cACV,MAAM,GAAG,UAAU,QAAQ,OAAO,CAAC;AAAA,cACnC,KAAK,GAAG,UAAU,QAAQ,MAAM,CAAC;AAAA,cACjC,YAAY,UAAU,YAAY;AAAA,cAClC,OAAO;AAAA,cACP,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,eAAe;AAAA,YACjB;AAAA,YAEC,YAAE;AAAA;AAAA,QACL;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAM,WAAW;AACjB,IAAM,SAAS;AACf,IAAM,UAAU;AAEhB,SAAS,SAAS,QAAwB;AACxC,MAAI,UAAU,GAAI,QAAO;AACzB,MAAI,UAAU,GAAI,QAAO;AACzB,SAAO;AACT;AAEA,SAAS,cACP,QACA,WACA,SACoD;AACpD,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,MAAM;AACV,aAAW,KAAK,OAAQ,KAAI,EAAE,MAAM,IAAK,OAAM,EAAE;AACjD,QAAM,MAAM,OAAO,IAAI,CAAC,MAAM;AAC5B,UAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,YAAa,EAAE,KAAK,aAAa,UAAW,SAAS,CAAC;AACrF,UAAM,IAAI,YAAa,KAAK,IAAI,EAAE,KAAK,GAAG,IAAI,MAAO;AACrD,WAAO,EAAE,GAAG,EAAE;AAAA,EAChB,CAAC;AAID,MAAI,IAAI,WAAW,EAAG,KAAI,KAAK,EAAE,GAAG,WAAW,GAAG,IAAI,CAAC,EAAG,EAAE,CAAC;AAC7D,MAAI,CAAC,EAAG,IAAI;AACZ,MAAI,IAAI,SAAS,CAAC,EAAG,IAAI;AACzB,QAAM,OAAO,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AACpG,QAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,QAAM,QAAQ,IAAI,CAAC;AACnB,QAAM,OAAO,GAAG,IAAI,KAAK,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,SAAS,KAAK,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,SAAS;AAC3F,SAAO,EAAE,MAAM,MAAM,IAAI;AAC3B;AAEA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,MAAM,CAAC,CAAC,UAAU,OAAO,SAAS;AACxC,QAAM,QAAQE,SAAQ,MAAO,MAAM,cAAc,MAAO,IAAI,MAAO,CAAC,QAAQ,GAAG,CAAC;AAChF,QAAM,QAAQA;AAAA,IACZ,MAAO,QAAQ,cAAc,MAAM,QAAQ,WAAW,OAAO,IAAI;AAAA,IACjE,CAAC,OAAO,WAAW,OAAO;AAAA,EAC5B;AACA,QAAM,QAAQ,QAAQ,SAAS,MAAM,MAAM,IAAI;AAE/C,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,kBAAe;AAAA,MACf,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ,GAAG,YAAY;AAAA,QACvB,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,MAAM,OAAO,eAAe;AAAA,cAC5B,UAAU;AAAA,cACV,WAAW;AAAA,cACX,UAAU;AAAA,cACV,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,eAAe;AAAA,cACf,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,SAAS;AAAA,cACT,aAAa;AAAA,cACb,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,UAAU,GAAI,YAAE,UAAS;AAAA,cAC9C,SACC,gBAAAA,KAAC,UAAK,gBAAc,KAAK,MAAM,MAAM,MAAM,GAAG,OAAO,EAAE,OAAO,UAAU,OAAO,GAC5E,YAAE,SAAS,KAAK,MAAM,MAAM,MAAM,GAAG,MAAM,aAAa,GAC3D;AAAA;AAAA;AAAA,QAEJ;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,MAAM,UAAU,aAAa;AAAA,cAC7B,OAAO,UAAU,GAAG,UAAU,OAAO;AAAA,cACrC,UAAU;AAAA,cACV,SAAS,KAAK,WAAW;AAAA,YAC3B;AAAA,YAEC,mBAAS,QACR,gBAAAC,MAAC,YACC;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAM;AAAA,kBACN,QAAQ;AAAA,kBACR,SAAS,OAAO,SAAS,IAAI,SAAS;AAAA,kBACtC,qBAAoB;AAAA,kBACpB,OAAO,EAAE,SAAS,QAAQ;AAAA,kBAC1B,eAAY;AAAA,kBAEZ;AAAA,oCAAAD,KAAC,UAAK,GAAG,MAAM,MAAM,MAAM,OAAO,aAAa,MAAM;AAAA,oBACrD,gBAAAA,KAAC,UAAK,GAAG,MAAM,MAAM,MAAK,QAAO,QAAQ,OAAO,aAAa,KAAK,cAAa,sBAAqB;AAAA;AAAA;AAAA,cACtG;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,EAAE,UAAU,YAAY,KAAK,OAAO,OAAO,OAAO,OAAO,QAAQ,UAAU,QAAQ,eAAe,OAAO;AAAA,kBAE/G,YAAE,SAAS,KAAK,MAAM,MAAM,cAAc,CAAC;AAAA;AAAA,cAC9C;AAAA,eACF,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,EAAE,UAAU,YAAY,KAAK,OAAO,MAAM,OAAO,WAAW,oBAAoB,OAAO,QAAQ,UAAU,OAAO;AAAA,gBAEtH,YAAE;AAAA;AAAA,YACL;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,SAAS,EAAE,SAAS,UAAU,WAAW,aAAa,QAAQ,OAAO,GAAkB;AACrG,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,WAAW,OAA8B,IAAI;AACnD,QAAM,eAAe,OAA8B,IAAI;AACvD,QAAM,aAAa,OAA8B,IAAI;AAIrD,QAAM,CAAC,cAAc,eAAe,IAAIG,UAAwB,IAAI;AACpE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAMpB,IAAI;AACd,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAwB,IAAI;AAChE,QAAM,SAAS,OAA8B,IAAI;AACjD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAA+C,IAAI;AAG/E,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,CAAC;AAE9D,kBAAgB,MAAM;AACpB,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,GAAI;AACT,UAAM,UAAU,MAAM,sBAAsB,KAAK,IAAI,GAAG,GAAG,cAAc,eAAe,CAAC;AACzF,YAAQ;AACR,UAAM,KAAK,IAAI,eAAe,OAAO;AACrC,OAAG,QAAQ,EAAE;AACb,WAAO,MAAM,GAAG,WAAW;AAAA,EAC7B,GAAG,CAAC,CAAC;AAML,kBAAgB,MAAM;AACpB,QAAI,CAAC,SAAS;AACZ,gBAAU,IAAI;AACd;AAAA,IACF;AACA,UAAM,KAAK,OAAO;AAClB,QAAI,CAAC,GAAI;AACT,UAAM,IAAI,GAAG,sBAAsB;AACnC,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,OAAO;AAClB,UAAM,MAAM;AACZ,QAAI,OAAO,QAAQ,UAAU;AAC7B,QAAI,OAAO,EAAE,QAAQ,IAAI,GAAI,QAAO,QAAQ,UAAU,EAAE,QAAQ;AAChE,QAAI,OAAO,EAAG,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAE,QAAQ,GAAG,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC;AAC1F,QAAI,MAAM,QAAQ,UAAU,EAAE,SAAS;AACvC,QAAI,MAAM,EAAG,OAAM,QAAQ,UAAU;AACrC,QAAI,MAAM,EAAE,SAAS,IAAI,GAAI,OAAM,KAAK,IAAI,GAAG,KAAK,EAAE,SAAS,CAAC;AAChE,cAAU,EAAE,MAAM,IAAI,CAAC;AAAA,EACzB,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,eAAeD;AAAA,IACnB,MAAM,WAAW,OAAO,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAAA,IAChE,CAAC,OAAO;AAAA,EACV;AAGA,QAAM,WAAW;AACjB,QAAM,SAAS,KAAK,IAAI,UAAU,CAAC;AACnC,QAAM,UAAU;AAChB,QAAM,QAAQA,SAAQ,MAAM,UAAU,UAAU,MAAM,GAAG,CAAC,UAAU,MAAM,CAAC;AAI3E,QAAM,mBAAoB,UAAU,MAAQ;AAC5C,QAAM,aAAa,KAAK,IAAI,oBAAoB,gBAAgB;AAChE,QAAM,UAAU,qBAAqB,KAAK,aAAa,qBAAqB;AAE5E,QAAM,UAAU,CAAC,CAAC,eAAe,YAAY,SAAS;AACtD,QAAM,YAAY,CAAC,CAAC,UAAU,OAAO,SAAS;AAC9C,MAAI,aAAa,WAAW,KAAK,CAAC,WAAW,CAAC,WAAW;AACvD,WACE,gBAAAF,KAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,SAAS,QAAQ,WAAW,UAAU,UAAU,OAAO,GACjF,YAAE,aACL;AAAA,EAEJ;AAEA,WAAS,gBAAgB,GAAe;AACtC,UAAM,QAAQ,SAAS;AACvB,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,SAAS,CAAC,QAAS;AACxB,UAAM,OAAO,MAAM,sBAAsB;AACzC,UAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE,UAAU,KAAK,OAAO,eAAe,KAAK,CAAC;AACnF,kBAAc,IAAI;AAIlB,UAAM,WAAW,QAAQ,sBAAsB,EAAE;AACjD,oBAAgB,KAAK,OAAO,WAAW,cAAc,QAAQ,IAAI;AAAA,EACnE;AACA,WAAS,mBAAmB;AAC1B,kBAAc,IAAI;AAClB,oBAAgB,IAAI;AACpB,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,aAAa,cAAc,OAAO,WAAW,aAAa,UAAU;AAE1E,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,MAGA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,aAAa;AAAA,YACb,cAAc;AAAA,YACd,OAAO;AAAA,cACL,UAAU;AAAA,cACV,WAAW,UAAU,SAAS;AAAA;AAAA;AAAA,cAG9B,YAAY,UAAU,SAAS;AAAA,YACjC;AAAA,YAEF,0BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO,UAAU,GAAG,kBAAkB,UAAU,OAAO;AAAA,gBACzD;AAAA,gBAGC;AAAA,gCAAc,QACb,gBAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAY;AAAA,sBACZ,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,KAAK;AAAA,wBACL,QAAQ;AAAA,wBACR,MAAM,GAAG,gBAAgB,CAAC;AAAA,wBAC1B,OAAO;AAAA,wBACP,YAAY;AAAA,wBACZ,eAAe;AAAA,wBACf,QAAQ;AAAA,sBACV;AAAA;AAAA,kBACF;AAAA,kBAED,cAAc,QAAQ,cAAc,QACnC,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,eAAY;AAAA,sBACZ,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,KAAK;AAAA,wBACL,MAAM,GAAG,gBAAgB,CAAC;AAAA,wBAC1B,WACE,aAAa,OACT,kBACA,aAAa,OACX,sBACA;AAAA,wBACR,UAAU;AAAA,wBACV,OAAO;AAAA,wBACP,YAAY;AAAA,wBACZ,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,eAAe;AAAA,wBACf,YAAY;AAAA,wBACZ,QAAQ;AAAA,sBACV;AAAA,sBAEC,qBAAW,UAAU;AAAA;AAAA,kBACxB;AAAA,kBAEF,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS;AAAA,sBACT;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA;AAAA,kBACF;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA;AAAA,kBACF;AAAA,kBACC,aAAa,IAAI,CAAC,MAAM,OAAO;AAC9B,0BAAM,QAAQ,SAAS,SAAS,MAAM,UAAU,QAAQ,SAAS;AACjE,0BAAM,EAAE,MAAM,SAAS,IAAI,YAAY,OAAO,iBAAiB,OAAO;AACtE,0BAAM,QAAQ,KAAK,MAAM,IAAI,YAAY;AAGzC,0BAAM,QAAQ,SAAS;AACvB,0BAAM,aAAa,KAAK,IAAI,GAAG,aAAa,IAAI,WAAW;AAC3D,wBAAI,WAAW;AACf,wBAAI,UAAoB,CAAC;AACzB,wBAAI,aAAa;AACjB,wBAAI,SAAS,KAAK,SAAS,GAAG;AAC5B,iCAAW,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAC7D,4BAAM,SAAS,SAAS,UAAU,UAAU;AAC5C,gCAAU,OAAO;AACjB,mCAAa,KAAK,IAAI,aAAa,OAAO,YAAY,YAAY,eAAe,WAAW;AAAA,oBAC9F;AACA,2BACE,gBAAAC;AAAA,sBAAC;AAAA;AAAA,wBAEC,aAAW;AAAA,wBACX,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,QAAQ,GAAG,UAAU;AAAA,0BACrB,YAAY;AAAA,0BACZ,cAAc;AAAA,wBAChB;AAAA,wBAIA;AAAA,0CAAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,OAAO;AAAA,gCACL,MAAM,OAAO,eAAe;AAAA,gCAC5B,UAAU;AAAA,gCACV,WAAW;AAAA,gCACX,UAAU;AAAA,gCACV,MAAM;AAAA,gCACN,QAAQ;AAAA,gCACR,SAAS;AAAA,gCACT,YAAY;AAAA,gCACZ,SAAS;AAAA,gCACT,OAAO;AAAA,gCACP,aAAa;AAAA,gCACb,YAAY;AAAA,8BACd;AAAA,8BAEA;AAAA,gDAAAD,KAAC,UAAK,OAAO,EAAE,MAAM,GAAG,UAAU,UAAU,cAAc,YAAY,YAAY,SAAS,GACxF,YAAE,UAAU,IAAI,GACnB;AAAA,gCACA,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,QAAQ,UAAU,QAAQ,YAAY,MAAM,GAAI,gBAAM,QAAO;AAAA;AAAA;AAAA,0BACrF;AAAA,0BAGA,gBAAAC;AAAA,4BAAC;AAAA;AAAA,8BACC,KAAK,OAAO,IAAI,WAAW;AAAA,8BAC3B,OAAO;AAAA,gCACL,MAAM,UAAU,aAAa;AAAA,gCAC7B,OAAO,UAAU,GAAG,UAAU,OAAO;AAAA,gCACrC,UAAU;AAAA,gCACV,SAAS,KAAK,WAAW;AAAA,8BAC3B;AAAA,8BAGC;AAAA,sCAAM,IAAI,CAACG,IAAG,OAAO;AACpB,wCAAM,WAAYA,KAAI,YAAY,UAAW;AAC7C,yCACE,gBAAAJ;AAAA,oCAAC;AAAA;AAAA,sCAEC,OAAO;AAAA,wCACL,UAAU;AAAA,wCACV,KAAK;AAAA,wCACL,QAAQ;AAAA,wCACR,MAAM,QAAQ,WAAW,gBAAgB,IAAI,WAAW,SAAS,UAAU,GAAG;AAAA,wCAC9E,OAAO;AAAA,wCACP,YAAY;AAAA,sCACd;AAAA;AAAA,oCARK,MAAM,EAAE;AAAA,kCASf;AAAA,gCAEJ,CAAC;AAAA,gCAKA,SAAS,IAAI,CAAC,GAAG,MAAM;AACtB,wCAAM,MAAM,kBAAkB,EAAE,CAAC;AACjC,wCAAM,QAAQ,uBAAuB,GAAG;AACxC,wCAAM,QAAQ,SAAS,MAAM,EAAE;AAC/B,wCAAM,cAAc,QAAQ,QAAQ,OAAO,QAAQ,WAAW,OAAO;AACrE,wCAAM,OACJ,QAAQ,SAAS,WAAW,KAAK,iBAAiB,KAAK,KAAK,aAAa,KAAK;AAChF,wCAAM,MAAM,QAAS,QAAQ,CAAC,KAAK,IAAK;AACxC,wCAAM,SAAS,QAAQ,GAAG,cAAc,OAAO,YAAY,YAAY,OAAO;AAI9E,wCAAM,gBAAgB,QAAQ,mBAAmB,MAAM,mBAAmB,MAAM,IAAK;AACrF,yCACE,gBAAAA;AAAA,oCAAC;AAAA;AAAA,sCAEC,YAAU;AAAA,sCACV,cAAc,CAAC,MAAkB;AAC/B,8CAAM,IAAK,EAAE,cAA8B,sBAAsB;AACjE,mDAAW,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,CAAC;AAAA,sCACtE;AAAA,sCACA,cAAc,MAAM,WAAW,IAAI;AAAA,sCACnC,SAAS,MAAM,SAAS,EAAE,CAAC;AAAA,sCAC3B,OAAO,YAAY,mBAAmB,EAAE,CAAC,KAAK,aAAa,SAAS;AAAA,sCACpE,OAAO;AAAA,wCACL,UAAU;AAAA,wCACV,KAAK;AAAA,wCACL,QAAQ,QAAQ,SAAY;AAAA,wCAC5B,QAAQ,QAAQ,GAAG,SAAS,OAAO;AAAA,wCACnC,MAAM,SAAS,WAAW,YAAY,WAAW,gBAAgB,IAAI,WAAW,SAAS,EAAE,UAAU,QAAQ,CAAC,CAAC,kBAAkB,YAAY,WAAW;AAAA,wCACxJ,OAAO,mBAAmB,IAAI,WAAW,YAAY,SAAS,oBAAoB,IAAI,WAAW,SAAS,EAAE,UAAU,QAAQ,CAAC,CAAC;AAAA,wCAChI,YAAY,2BAA2B,KAAK,KAAK,KAAK;AAAA,wCACtD,SAAS,QAAQ,IAAI;AAAA,wCACrB,cAAc;AAAA,wCACd,WAAW,QAAQ,YAAY,KAAK,sBAAsB;AAAA,wCAC1D,QAAQ,SAAS,YAAY;AAAA,wCAC7B,YAAY;AAAA,wCACZ,WAAW,QAAQ,iBAAiB;AAAA,wCACpC,QAAQ,QAAQ,cAAc,aAAa,MAAM;AAAA,wCACjD,QAAQ,QAAQ,IAAI;AAAA,sCACtB;AAAA;AAAA,oCAzBK,OAAO,IAAI,IAAI,CAAC;AAAA,kCA0BvB;AAAA,gCAEJ,CAAC;AAAA,gCAKA,SAAS,IAAI,CAAC,GAAG,MAAM;AACtB,wCAAM,QAAQ,uBAAuB,EAAE,KAAK;AAC5C,wCAAM,UAAU,EAAE,YAAY;AAC9B,wCAAM,QAAQ,SAAS,MAAM,EAAE;AAC/B,wCAAM,cAAc,EAAE,UAAU,QAAQ,OAAO,EAAE,UAAU,WAAW,OAAO;AAC7E,wCAAM,IAAI,WAAW,KAAK,IAAI,GAAG,KAAK,KAAK,EAAE,KAAK,IAAI,GAAG;AACzD,wCAAM,OACJ,EAAE,UAAU,SACR,WAAW,KAAK,iBAAiB,KAAK,KACtC,aAAa,KAAK;AACxB,wCAAM,OAAO,EAAE,QAAQ,IAAI,gCAAgC;AAC3D,wCAAM,aAAa,SAAS,IAAI,CAAC,YAAY,WAAW,gBAAgB,IAAI,WAAW,SAAS,EAAE,UAAU,QAAQ,CAAC,CAAC,kBAAkB,IAAI,CAAC;AAG7I,wCAAM,YAAY,EAAE,YAAY;AAChC,yCACE,gBAAAC,MAAC,YACC;AAAA,oDAAAD;AAAA,sCAAC;AAAA;AAAA,wCACC,YAAU;AAAA,wCACV,cAAc,CAAC,MAAkB;AAC/B,gDAAM,IAAK,EAAE,cAA8B,sBAAsB;AACjE,qDAAW;AAAA,4CACT,GAAG,EAAE;AAAA,4CACL,SAAS,EAAE,OAAO,EAAE,QAAQ;AAAA,4CAC5B,SAAS,EAAE;AAAA,4CACX,OAAO,EAAE;AAAA,4CACT,SAAS,EAAE;AAAA,0CACb,CAAC;AAAA,wCACH;AAAA,wCACA,cAAc,MAAM,WAAW,IAAI;AAAA,wCACnC,SAAS,MAAM,SAAS,EAAE,GAAG;AAAA,wCAC7B,OAAO,YAAY,mBAAmB,EAAE,GAAG,KAAK,aAAa,SAAS;AAAA,wCACtE,OAAO;AAAA,0CACL,UAAU;AAAA,0CACV,KAAK;AAAA,0CACL,MAAM;AAAA,0CACN,OAAO,GAAG,CAAC;AAAA,0CACX,QAAQ,GAAG,CAAC;AAAA,0CACZ,YAAY,IAAI,IAAI,CAAC;AAAA,0CACrB,WAAW,QAAQ,iCAAiC;AAAA,0CACpD,YAAY;AAAA,0CACZ,SAAS,QAAQ,IAAI;AAAA,0CACrB,cAAc;AAAA,0CACd,YAAY,QAAQ,WAAW,KAAK,eAAe,KAAK,KAAK,QAAQ;AAAA,0CACrE,QAAQ,SAAS,YAAY;AAAA,0CAC7B,YAAY;AAAA,0CACZ,QAAQ,QAAQ,IAAI;AAAA,wCACtB;AAAA;AAAA,oCACF;AAAA,oCACC,EAAE,QAAQ,KACT,gBAAAC;AAAA,sCAAC;AAAA;AAAA,wCACC,eAAY;AAAA,wCACZ,OAAO;AAAA,0CACL,UAAU;AAAA,0CACV,KAAK;AAAA,0CACL,MAAM;AAAA,0CACN,YAAY,YAAY,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC;AAAA,0CACxD,WAAW,YAAY,2BAA2B;AAAA,0CAClD,UAAU;AAAA,0CACV,YAAY;AAAA,0CACZ,YAAY;AAAA,0CACZ,OAAO;AAAA,0CACP,YAAY;AAAA,0CACZ,SAAS;AAAA,0CACT,cAAc;AAAA,0CACd,YAAY;AAAA,0CACZ,eAAe;AAAA,0CACf,QAAQ,QAAQ,IAAI;AAAA,wCACtB;AAAA,wCACD;AAAA;AAAA,0CACG,EAAE;AAAA;AAAA;AAAA,oCACN;AAAA,uCAvDW,MAAM,IAAI,IAAI,CAAC,EAyD9B;AAAA,gCAEJ,CAAC;AAAA;AAAA;AAAA,0BACH;AAAA;AAAA;AAAA,sBA7LK;AAAA,oBA8LP;AAAA,kBAEJ,CAAC;AAAA,kBAGD,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,QAAQ,GAAG,WAAW;AAAA,wBACtB,YAAY;AAAA,wBACZ,OAAO;AAAA,wBACP,UAAU;AAAA,sBACZ;AAAA,sBAEA;AAAA,wCAAAD;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAO;AAAA,8BACL,MAAM,OAAO,eAAe;AAAA,8BAC5B,UAAU;AAAA,8BACV,WAAW;AAAA,8BACX,UAAU;AAAA,8BACV,MAAM;AAAA,8BACN,QAAQ;AAAA,8BACR,SAAS;AAAA,8BACT,YAAY;AAAA,8BACZ,gBAAgB;AAAA,8BAChB,SAAS;AAAA,8BACT,aAAa;AAAA,8BACb,YAAY;AAAA,8BACZ,OAAO;AAAA,4BACT;AAAA,4BAEC,YAAE;AAAA;AAAA,wBACL;AAAA,wBACA,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAO;AAAA,8BACL,MAAM,UAAU,aAAa;AAAA,8BAC7B,OAAO,UAAU,GAAG,UAAU,OAAO;AAAA,8BACrC,UAAU;AAAA,8BACV,SAAS,KAAK,WAAW;AAAA,4BAC3B;AAAA,4BAEC,gBAAM,IAAI,CAACI,IAAG,OAAO;AACpB,oCAAM,WAAYA,KAAI,YAAY,UAAW;AAC7C,oCAAM,QACJ,UAAU,IAAI,kBAAkB,UAAU,KAAK,sBAAsB;AACvE,qCACE,gBAAAH,MAAC,YACC;AAAA,gDAAAD;AAAA,kCAAC;AAAA;AAAA,oCACC,OAAO;AAAA,sCACL,UAAU;AAAA,sCACV,KAAK;AAAA,sCACL,QAAQ;AAAA,sCACR,OAAO;AAAA,sCACP,YAAY;AAAA,sCACZ,MAAM,QAAQ,WAAW,gBAAgB,IAAI,WAAW,SAAS,UAAU,GAAG;AAAA,oCAChF;AAAA;AAAA,gCACF;AAAA,gCACA,gBAAAA;AAAA,kCAAC;AAAA;AAAA,oCACC,OAAO;AAAA,sCACL,UAAU;AAAA,sCACV,KAAK;AAAA,sCACL,MAAM,QAAQ,WAAW,gBAAgB,IAAI,WAAW,SAAS,UAAU,GAAG;AAAA,sCAC9E,WAAW;AAAA,sCACX,YAAY;AAAA,oCACd;AAAA,oCAEC,qBAAWI,EAAC;AAAA;AAAA,gCACf;AAAA,mCArBa,MAAM,EAAE,EAsBvB;AAAA,4BAEJ,CAAC;AAAA;AAAA,wBACH;AAAA;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YACF;AAAA;AAAA,QAEA;AAAA,QAEC,WACC,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,OAAO;AAAA,cACL,UAAU;AAAA;AAAA;AAAA;AAAA,cAIV,MAAM,GAAG,SAAS,OAAO,OAAO,CAAC;AAAA,cACjC,KAAK,GAAG,SAAS,OAAO,MAAM,CAAC;AAAA,cAC/B,YAAY,SAAS,YAAY;AAAA,cACjC,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,SAAS;AAAA,cACT,UAAU;AAAA,cACV,OAAO;AAAA,cACP,eAAe;AAAA,cACf,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,WAAW;AAAA,YACb;AAAA,YAEC,kBAAQ,EAAE,SAAS,YAAY,QAAQ,WAAW,QAAQ,SAAS,QAAQ,QAAQ,IAClF,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,QAAQ;AAAA,gBACjB,OAAO,QAAQ;AAAA,gBACf,GAAG,QAAQ;AAAA,gBACX;AAAA;AAAA,YACF,IAEA,gBAAAC,MAAC,YACC;AAAA,8BAAAD,KAAC,kBAAe,GAAG,QAAQ,GAAG,WAAsB;AAAA,cACnD,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,KACxC,gBAAAC,MAAC,UAAK,OAAO,EAAE,OAAO,QAAQ,YAAY,MAAM,GAAG;AAAA;AAAA,gBAAE,QAAQ;AAAA,iBAAM;AAAA,eAEvE;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,IAAM,gBAAgB;AAEtB,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,OAAO,mBAAmB,CAAC;AACjC,QAAM,KAAK,QAAQ,OAAO,KAAK,KAAK,WAAW,OAAO,SAAS,CAAC;AAChE,QAAM,KAAK,gBAAgB,OAAO;AAClC,QAAM,QAAQ,GAAG,MAAM,GAAG,aAAa;AACvC,QAAM,OAAO,GAAG,SAAS,MAAM;AAC/B,SACE,gBAAAA,MAAC,YACC;AAAA,oBAAAA,MAAC,SACC;AAAA,sBAAAA,MAAC,YAAQ;AAAA;AAAA,QAAM;AAAA,SAAQ;AAAA,MAAS;AAAA,MAAC,gBAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAI,cAAG;AAAA,OACvE;AAAA,IACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,OAAO,WAAW,WAAW,MAAM,GAC9C;AAAA,YAAM,IAAI,CAAC,GAAG,MACb,gBAAAA,MAAC,UACE;AAAA,YAAI,IAAI,WAAQ;AAAA,QAChB,EAAE;AAAA,QACF,EAAE,QAAQ,IAAI,QAAK,EAAE,KAAK,KAAK;AAAA,WAHvB,EAAE,SAIb,CACD;AAAA,MACA,OAAO,IAAI,UAAO,IAAI,KAAK;AAAA,OAC9B;AAAA,KACF;AAEJ;AAEA,SAAS,eAAe,EAAE,GAAG,UAAU,GAAqC;AAC1E,QAAM,MAAM,kBAAkB,CAAC;AAC/B,QAAM,QAAQ,uBAAuB,GAAG;AACxC,QAAM,OAAO,mBAAmB,CAAC;AACjC,QAAM,IAAI,QAAQ,OAAO,OAAO,OAAO;AACvC,QAAM,KAAK,KAAK,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC;AAC9C,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,gBAAAA,MAAC,UAAK;AAAA,wBAAAD,KAAC,YAAO,uBAAS;AAAA,QAAS;AAAA,QAAC,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,GAAI;AAAA,YAAE,SAAS,QAAQ,CAAC;AAAA,UAAE;AAAA,WAAE;AAAA,QAAO;AAAA,QAAE;AAAA,SAAG;AAAA,IACvG,KAAK;AACH,aAAO,gBAAAA,MAAC,UAAK;AAAA,wBAAAD,KAAC,YAAO,2BAAa;AAAA,QAAS;AAAA,QAAC,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,GAAI;AAAA,YAAE,SAAS,QAAQ,CAAC;AAAA,UAAE;AAAA,WAAE;AAAA,SAAS,EAAE,SAAS,KAAK,IAAI,QAAK,EAAE,KAAK,KAAK;AAAA,QAAG;AAAA,QAAE;AAAA,SAAG;AAAA,IACrJ,KAAK;AACH,aAAO,gBAAAA,MAAC,UAAK;AAAA,wBAAAD,KAAC,YAAO,0BAAY;AAAA,QAAS;AAAA,QAAC,gBAAAA,KAAC,UAAK,OAAO,EAAE,MAAM,GAAI,YAAE,MAAM,QAAQ,CAAC,GAAE;AAAA,QAAO;AAAA,QAAE;AAAA,SAAG;AAAA,IACrG,KAAK;AACH,aAAO,gBAAAC,MAAC,UAAK;AAAA,wBAAAD,KAAC,YAAQ,YAAE,WAAU;AAAA,QAAS;AAAA,QAAC,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,GAAI;AAAA,YAAE,SAAS,QAAQ,CAAC;AAAA,UAAE;AAAA,WAAE;AAAA,QAAO;AAAA,QAAE;AAAA,SAAG;AAAA,IAC3G,KAAK;AACH,aAAO,gBAAAA,MAAC,UAAK;AAAA,wBAAAD,KAAC,YAAQ,YAAE,IAAI,MAAM,GAAG,EAAE,GAAE;AAAA,QAAS;AAAA,QAAC,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,GAAI;AAAA,YAAE,SAAS,QAAQ,CAAC;AAAA,UAAE;AAAA,WAAE;AAAA,QAAO;AAAA,QAAE;AAAA,SAAG;AAAA,IAClH,KAAK;AACH,aAAO,gBAAAA,MAAC,UAAK;AAAA,wBAAAD,KAAC,YAAQ,YAAE,WAAU;AAAA,QAAS;AAAA,QAAC,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,GAAI;AAAA,YAAE,SAAS,QAAQ,CAAC;AAAA,UAAE;AAAA,WAAE;AAAA,QAAO;AAAA,QAAE;AAAA,SAAG;AAAA,IAC3G,KAAK;AACH,aAAO;AAAA,EACX;AACF;;;AClmCM,gBAAAI,MAwCQ,QAAAC,aAxCR;AA3CN,SAAS,UAAU,SAAsC;AACvD,QAAM,SAAS,oBAAI,IAA4B;AAC/C,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,OAAO,IAAI,EAAE,SAAS,EAAG,QAAO,IAAI,EAAE,WAAW,CAAC,CAAC;AACxD,WAAO,IAAI,EAAE,SAAS,EAAG,KAAK,CAAC;AAAA,EACjC;AACA,QAAM,SAAsB,CAAC;AAC7B,aAAW,CAAC,MAAM,IAAI,KAAK,QAAQ;AACjC,QAAI,QAAQ;AACZ,QAAI,MAAM;AACV,QAAI,QAAmC;AACvC,eAAW,KAAK,MAAM;AACpB,eAAS,EAAE;AACX,UAAI,EAAE,WAAW,IAAK,OAAM,EAAE;AAC9B,YAAM,MAAM,kBAAkB,CAAC;AAC/B,UAAI,QAAQ,UAAW,QAAQ,YAAY,UAAU,MAAQ,SAAQ;AAAA,IACvE;AACA,WAAO,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,QAAQ,SAAS,OAAO,OAAO,KAAK,eAAe,MAAM,CAAC;AAAA,EACvG;AACA,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAC3C,SAAO;AACT;AAEA,IAAM,QAAQ;AAEP,SAAS,eAAe,EAAE,SAAS,SAAS,GAAwB;AACzE,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,OAAO,UAAU,OAAO;AAC9B,QAAM,MAAM,KAAK,MAAM,GAAG,KAAK;AAC/B,QAAM,MAAM,IAAI,SAAS,IAAI,IAAI,CAAC,EAAG,UAAU;AAC/C,QAAM,cAAc,KAAK,SAAS,IAAI;AAEtC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,cAAc;AAAA,QACd,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA,MAEA;AAAA,wBAAAD,KAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,OAAO,QAAQ,eAAe,aAAa,eAAe,SAAS,cAAc,MAAM,GACpH,YAAE,cACL;AAAA,QACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,MAAM,GAChE;AAAA,cAAI,IAAI,CAAC,MAAM;AACd,kBAAM,WAAW,MAAM,IAAI,KAAK,IAAI,GAAI,EAAE,UAAU,MAAO,GAAG,IAAI;AAClE,kBAAM,QAAQ,eAAe,EAAE,aAAa;AAC5C,mBACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC,kBAAgB,EAAE;AAAA,gBAClB,SAAS,MAAM,WAAW,EAAE,SAAS;AAAA,gBACrC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,QAAQ,WAAW,YAAY;AAAA,kBAC/B,SAAS;AAAA,gBACX;AAAA,gBACA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK;AAAA,gBAEhE;AAAA,kCAAAD,KAAC,YAAO,OAAO,EAAE,MAAM,WAAW,UAAU,UAAU,cAAc,YAAY,YAAY,SAAS,GAClG,YAAE,WACL;AAAA,kBACA,gBAAAA,KAAC,SAAI,OAAO,EAAE,MAAM,KAAK,UAAU,YAAY,QAAQ,QAAQ,YAAY,WAAW,cAAc,MAAM,GACxG,0BAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,MAAM;AAAA,wBACN,KAAK;AAAA,wBACL,QAAQ;AAAA,wBACR,OAAO,GAAG,QAAQ;AAAA,wBAClB,YAAY;AAAA,wBACZ,SAAS,EAAE,kBAAkB,QAAQ,MAAM;AAAA,wBAC3C,cAAc;AAAA,sBAChB;AAAA;AAAA,kBACF,GACF;AAAA,kBACA,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,YAAY,OAAO,UAAU,QAAQ,WAAW,QAAQ,GAC1E;AAAA,sBAAE,QAAQ,QAAQ,CAAC;AAAA,oBAAE;AAAA,qBACxB;AAAA,kBACA,gBAAAA,MAAC,UAAK,OAAO,EAAE,MAAM,YAAY,OAAO,QAAQ,UAAU,QAAQ,WAAW,QAAQ,GAAG;AAAA;AAAA,oBACpF,EAAE;AAAA,qBACN;AAAA;AAAA;AAAA,cApCK,EAAE;AAAA,YAqCT;AAAA,UAEJ,CAAC;AAAA,UACA,cAAc,KACb,gBAAAD,KAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,OAAO,QAAQ,WAAW,MAAM,GAC7D,YAAE,eAAe,WAAW,GAC/B;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACrHA,SAAS,iBAAiB;;;ACqBpB,SA2BF,YAAAE,WA3BE,OAAAC,MAIE,QAAAC,aAJF;AAnBC,SAAS,YAAY,GAA0B;AACpD,QAAM,IAAI,EAAE;AACZ,MAAI,EAAE,SAAS,SAAU,QAAO,GAAG,EAAE,SAAS,KAAK,EAAE,MAAM;AAC3D,MAAI,EAAE,SAAS,iBAAiB;AAC9B,UAAM,MAAM,EAAE,MAAM,CAAC;AACrB,WAAO,MAAM,sBAAmB,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAAA,EAC3D;AACA,SAAO,gBAAgB,EAAE,MAAM,QAAQ,CAAC,CAAC;AAC3C;AAKO,SAAS,iBAAiB,EAAE,OAAO,GAA8B;AACtE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,oBAAkB,OAAO,OAAO;AAAA,MAChC,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,OAAO,SAAS,SAAS,OAAO,OAAO;AAAA,MAE5F;AAAA,wBAAAD,KAAC,UAAK,OAAO,EAAE,UAAU,UAAU,cAAc,YAAY,YAAY,SAAS,GAC/E,sBAAY,MAAM,GACrB;AAAA,QACC,OAAO,YACN,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,YAAY,OAAO,OAAO,GAAG;AAAA;AAAA,UAAG,OAAO,SAAS;AAAA,WAAU;AAAA,QAEhF,OAAO,eAAe,YACrB,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU;AAAA,cACV,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,SAAS;AAAA,YACX;AAAA,YACD;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEO,SAAS,kBAAkB,EAAE,QAAQ,GAAiC;AAC3E,MAAI,QAAQ,WAAW,EAAG,QAAO,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAG,oBAAC;AAClE,SACE,gBAAAA,KAAAD,WAAA,EACG,kBAAQ,IAAI,CAAC,GAAG,MACf,gBAAAC,KAAC,oBAAyB,QAAQ,KAAX,CAAc,CACtC,GACH;AAEJ;;;ADHQ,gBAAAE,MACW,QAAAC,aADX;AA5CR,IAAM,SAAyD;AAAA,EAC7D,EAAE,OAAO,eAAe,UAAU,aAAa;AAAA,EAC/C,EAAE,OAAO,cAAc,UAAU,iBAAiB;AAAA,EAClD,EAAE,OAAO,gBAAgB,UAAU,eAAe;AACpD;AAIA,SAAS,wBAAwB,SAAmC;AAClE,MAAI,QAAwB;AAC5B,aAAW,MAAM,UAAU,OAAO,GAAG;AACnC,QAAI,GAAG,OAAO,SAAS,cAAe;AACtC,QAAI,CAAC,SAAS,GAAG,OAAO,WAAW,MAAM,OAAO,SAAU,SAAQ;AAAA,EACpE;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,SAAkB,OAAyB;AAC1D,QAAM,IAAI,QAAQ;AAClB,MAAI,EAAE,SAAS,cAAe,QAAO;AACrC,SAAO,UAAU,gBAAgB,EAAE,aAAa,UAAU,eAAe,EAAE,aAAa,EAAE;AAC5F;AAEO,SAAS,WAAW,EAAE,QAAQ,GAA0B;AAC7D,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,UAAU,wBAAwB,OAAO;AAC/C,MAAI,CAAC,WAAW,QAAQ,OAAO,SAAS,cAAe,QAAO;AAC9D,QAAM,IAAI,QAAQ;AAClB,QAAM,SAAS,EAAE,SAAS,OAAO,EAAE,MAAM,KAAK;AAE9C,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,oBAAgB;AAAA,MAChB,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,wBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,WAAW,cAAc,qBAAqB,OAAO,OAAO,GACjF;AAAA,0BAAAD,KAAC,YAAQ,YAAE,WAAU;AAAA,UACpB;AAAA,UAAO;AAAA,UAAG,gBAAAC,MAAC,YAAQ;AAAA,iBAAK,MAAM,EAAE,QAAQ;AAAA,YAAE;AAAA,aAAE;AAAA,UAAU;AAAA,UACvD,gBAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAG,iBAAG;AAAA,WACrC;AAAA,QACC,OAAO,IAAI,CAAC,EAAE,OAAO,SAAS,MAAM;AACnC,gBAAM,UAAU,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK;AAC/D,iBACE,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,kBAAgB;AAAA,cAChB,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,SAAS,WAAW,WAAW,oBAAoB;AAAA,cAEzF;AAAA,gCAAAA,MAAC,SAAI,OAAO,EAAE,MAAM,YAAY,OAAO,OAAO,GAC3C;AAAA,oBAAE,QAAQ;AAAA,kBACX,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,UAAU,OAAO,GAAI;AAAA,yBAAK,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,oBAAE;AAAA,qBAAE;AAAA,mBAC1F;AAAA,gBACA,gBAAAD,KAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,GACjC,0BAAAA,KAAC,qBAAkB,SAAkB,GACvC;AAAA;AAAA;AAAA,YAVK;AAAA,UAWP;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;;;AE3EA,SAAS,aAAAE,kBAAiB;AAuClB,gBAAAC,MAA8C,QAAAC,aAA9C;AAhCR,SAAS,qBAAqB,SAAmC;AAC/D,MAAI,QAAwB;AAC5B,aAAW,MAAMC,WAAU,OAAO,GAAG;AACnC,QAAI,GAAG,OAAO,SAAS,YAAa;AACpC,QAAI,CAAC,SAAS,GAAG,OAAO,WAAW,MAAM,OAAO,SAAU,SAAQ;AAAA,EACpE;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,EAAE,QAAQ,GAA0B;AAClE,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,UAAU,qBAAqB,OAAO;AAC5C,MAAI,CAAC,WAAW,QAAQ,OAAO,SAAS,YAAa,QAAO;AAG5D,MAAI,QAAQ,QAAQ,WAAW,EAAG,QAAO;AACzC,QAAM,IAAI,QAAQ;AAElB,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,0BAAsB;AAAA,MACtB,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,wBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,WAAW,cAAc,qBAAqB,OAAO,OAAO,GACjF;AAAA,0BAAAD,KAAC,YAAQ,YAAE,UAAU,WAAW,GAAE;AAAA,UAAS;AAAA,UAAG,gBAAAC,MAAC,YAAQ;AAAA,iBAAK,MAAM,EAAE,QAAQ;AAAA,YAAE;AAAA,aAAE;AAAA,WAClF;AAAA,QACA,gBAAAD,KAAC,SAAI,OAAO,EAAE,SAAS,UAAU,GAC/B,0BAAAA,KAAC,qBAAkB,SAAS,QAAQ,SAAS,GAC/C;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACxCO,SAAS,iBAAiB,QAAwB;AACvD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,UAAU;AACb,YAAM,QAAQ,CAAC,OAAO,SAAS;AAC/B,UAAI,OAAO,aAAc,OAAM,KAAK,GAAG,OAAO,YAAY;AAC1D,UAAI,OAAO,QAAS,YAAW,KAAK,OAAO,QAAS,OAAM,KAAK,EAAE,SAAS;AAC1E,aAAO,MAAM,KAAK,GAAG,EAAE,YAAY;AAAA,IACrC;AAAA,IACA,KAAK;AACH,aAAO,OAAO,IAAI,YAAY;AAAA,IAChC,KAAK;AACH,aAAO,OAAO,KAAK,YAAY;AAAA,IACjC,KAAK;AACH,aAAO,CAAC,OAAO,WAAW,OAAO,UAAU,EAAE,EAAE,KAAK,GAAG,EAAE,YAAY;AAAA,IACvE,KAAK,iBAAiB;AACpB,YAAM,IAAI,OAAO,MAAM,CAAC;AACxB,aAAO,IAAI,CAAC,EAAE,UAAU,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,EAAE,YAAY,IAAI;AAAA,IAChE;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,QAAkB,CAAC;AACzB,UAAI,OAAO;AACT,mBAAW,KAAK,OAAO,QAAS,OAAM,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,SAAS;AACzF,UAAI,OAAO;AACT,mBAAW,KAAK,OAAO,YAAa,OAAM,KAAK,EAAE,MAAM,UAAU,IAAI,EAAE,MAAM,IAAI;AACnF,aAAO,MAAM,KAAK,GAAG,EAAE,YAAY;AAAA,IACrC;AAAA,IACA,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGO,SAAS,oBAAoB,QAAgB,OAAwB;AAC1E,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,MAAI,CAAC,EAAG,QAAO;AACf,SAAO,iBAAiB,MAAM,EAAE,SAAS,CAAC;AAC5C;;;ATmBI,SAkOA,YAAAG,WAjKA,OAAAC,MAjEA,QAAAC,aAAA;AAtBJ,IAAM,sBAAoD;AAAA,EACxD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,SAAS,kBAAkB,GAAY,QAA8B;AACnE,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAS,aAAO,EAAE;AAAA,IACvB,KAAK;AAAS,aAAO,EAAE;AAAA,IACvB,KAAK;AAAS,aAAO,EAAE;AAAA,IACvB,KAAK;AAAU,aAAO,EAAE;AAAA,EAC1B;AACF;AAEA,SAAS,gBAAgB,EAAE,QAAQ,aAAa,GAAsD;AACpG,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,QAAQ,oBAAoB,MAAM;AACxC,QAAM,QAAQ,kBAAkB,GAAG,MAAM;AACzC,QAAM,OAAO,WAAW,WAAW,gBAAgB,aAAa,SAAS,IAAI,KAAK,aAAa,KAAK,IAAI,CAAC,KAAK;AAC9G,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA,QAAQ,aAAa,KAAK;AAAA,QAC1B,cAAc;AAAA,QACd,SAAS;AAAA,QACT,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,MAEC;AAAA;AAAA,QAAO;AAAA;AAAA;AAAA,EACV;AAEJ;AASA,IAAM,aAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAMC,mBAAkE;AAAA,EACtE,gBAAgB,EAAE,QAAQ,QAAQ,OAAO,OAAO;AAAA,EAChD,eAAe,EAAE,QAAQ,QAAQ,MAAM,OAAO;AAAA,EAC9C,aAAa,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,EAC1C,YAAY,EAAE,KAAK,QAAQ,MAAM,OAAO;AAC1C;AAEA,SAAS,YAAY,SAAiD;AACpE,QAAM,MAAM;AAAA,IACV,iBAAiB,CAAC;AAAA,IAClB,gBAAgB,CAAC;AAAA,IACjB,aAAa,CAAC;AAAA,IACd,eAAe,CAAC;AAAA,IAChB,WAAW,CAAC;AAAA,IACZ,aAAa,CAAC;AAAA,IACd,UAAU,CAAC;AAAA,EACb;AACA,aAAW,KAAK,QAAS,KAAI,EAAE,IAAI,EAAE,KAAK,CAAC;AAC3C,SAAO;AACT;AAEA,IAAMC,kBAAyD;AAAA,EAC7D,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AACR;AAEA,SAAS,UAAU,EAAE,OAAO,GAAuB;AACjD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,eAAa;AAAA,MACb,cAAY,EAAE,YAAY,MAAM;AAAA,MAChC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY,aAAa,MAAM;AAAA,QAC/B,aAAa;AAAA,QACb,eAAe;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,UAAU,KAAa,OAAuB;AAErD,QAAM,IAAI,oBAAoB,KAAK,GAAG;AACtC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,EAAE,CAAC;AACb,QAAM,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AACpC,QAAM,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AACpC,QAAM,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AACpC,SAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;AACxC;AAEA,SAAS,UAAU,OAAuB;AACxC,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,QAAQ,KAAO,QAAO,MAAM,cAAc,CAAC;AAC/C,MAAI,QAAQ,KAAM,QAAO,MAAM,QAAQ,CAAC;AACxC,SAAO,MAAM,QAAQ,CAAC;AACxB;AAEA,SAAS,QAAQ,GAAmB;AAClC,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,sBAAiB,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,IACnE,KAAK;AACH,aAAO,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,mBAAc,UAAU,EAAE,KAAK,CAAC,WAAM,EAAE,QAAQ,MAAM;AAAA,IACnF,KAAK;AACH,aAAO,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,sBAAiB,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,IACnE,KAAK;AACH,aAAO,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,IAAI,EAAE,MAAM,KAAK,EAAE,WAAM,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,IACnF,KAAK;AACH,aAAO,GAAG,EAAE,IAAI,SAAS,KAAK,EAAE,IAAI,MAAM,GAAG,EAAE,IAAI,QAAQ,EAAE,GAAG,WAAM,EAAE,SAAS,QAAQ,CAAC,CAAC,KAAK,EAAE,WAAW,qBAAgB,EAAE;AAAA,IACjI,KAAK;AACH,aAAO,GAAG,EAAE,IAAI,KAAK,EAAE,MAAM,QAAQ,CAAC,CAAC;AAAA,IACzC,KAAK;AACH,aAAO,GAAG,EAAE,SAAS,WAAM,EAAE,MAAM,WAAM,EAAE,SAAS,QAAQ,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,WAAM,EAAE,KAAK,gBAAgB,EAAE;AAAA,EAC/H;AACF;AAEA,IAAM,mBAAmB,EAAE,OAAO,QAAQ,aAAa,MAAM;AAC7D,IAAM,iBAAiB,EAAE,SAAS,SAAS,SAAS,QAAQ,KAAK,MAAM;AACvE,IAAM,YAAY;AAAA,EAChB,YAAY;AAAA,EACZ,UAAU;AACZ;AAEA,SAAS,kBAAkB,EAAE,EAAE,GAA6B;AAC1D,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,SACE,gBAAAC,MAAC,SAAI,OAAO,EAAE,aAAa,OAAO,GAChC;AAAA,oBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,OAAM;AAAA,MAAO,gBAAAA,KAAC,UAAM,YAAE,MAAM,QAAQ,CAAC,GAAE;AAAA,OAAO;AAAA,IAC3G,EAAE,QAAQ,WAAW,IACpB,gBAAAA,KAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GAAI,YAAE,eAAc,IAEhD,EAAE,QAAQ,IAAI,CAAC,GAAG,MAChB,gBAAAC,MAAC,SAAY,OAAO,EAAE,GAAG,gBAAgB,GAAG,UAAU,GACpD;AAAA,sBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAI;AAAA,UAAE;AAAA,QAAK;AAAA,QAAE,IAAI;AAAA,SAAE;AAAA,MAChD,gBAAAA,MAAC,UAAK;AAAA;AAAA,QAAG,EAAE,EAAE,QAAQ,CAAC;AAAA,QAAE;AAAA,QAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,QAAE;AAAA,QAAI,EAAE,MAAM,QAAQ,CAAC;AAAA,QAAE;AAAA,QAAI,EAAE,OAAO,QAAQ,CAAC;AAAA,SAAE;AAAA,SAFlF,CAGV,CACD;AAAA,KAEL;AAEJ;AAEA,SAAS,cAAc,EAAE,EAAE,GAAyB;AAClD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,SACE,gBAAAA,MAAC,SAAI,OAAO,EAAE,aAAa,OAAO,GAChC;AAAA,oBAAAD,KAAC,SAAI,OAAO,EAAE,GAAG,gBAAgB,GAAG,WAAW,WAAW,YAAqB,GAC7E,0BAAAA,KAAC,UAAM,YAAE,KAAI,GACf;AAAA,IACA,gBAAAC,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,SAAQ;AAAA,MAAO,gBAAAC,MAAC,UAAM;AAAA,UAAE,UAAU,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OAAO;AAAA,IACpH,gBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,UAAS;AAAA,MAAO,gBAAAC,MAAC,UAAM;AAAA,UAAE,SAAS,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OAAO;AAAA,IACpH,gBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,MAAK;AAAA,MAAO,gBAAAC,MAAC,UAAO;AAAA,WAAE,OAAO,MAAM,QAAQ,CAAC;AAAA,QAAE;AAAA,QAAK,EAAE;AAAA,QAAK;AAAA,QAAE,EAAE;AAAA,QAAM;AAAA,SAAC;AAAA,OAAO;AAAA,IAC1I,gBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,gBAAe;AAAA,MAAO,gBAAAA,KAAC,UAAM,YAAE,WAAW,EAAE,MAAM,EAAE,IAAG;AAAA,OAAO;AAAA,KAC9H;AAEJ;AAEA,SAAS,eAAe,EAAE,EAAE,GAA0B;AACpD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,SACE,gBAAAC,MAAC,SAAI,OAAO,EAAE,aAAa,OAAO,GAChC;AAAA,oBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,QAAO;AAAA,MAAO,gBAAAA,KAAC,UAAM,YAAE,MAAK;AAAA,OAAO;AAAA,IACjG,gBAAAC,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,OAAM;AAAA,MAAO,gBAAAA,KAAC,UAAM,YAAE,MAAM,QAAQ,CAAC,GAAE;AAAA,OAAO;AAAA,KAC9G;AAEJ;AAEA,SAAS,aAAa,EAAE,EAAE,GAAwB;AAChD,QAAM,EAAE,EAAE,IAAI,QAAQ;AAEtB,MAAI,EAAE,WAAW,EAAE,QAAQ,SAAS,GAAG;AACrC,WACE,gBAAAC,MAAC,SAAI,OAAO,EAAE,aAAa,OAAO,GAChC;AAAA,sBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,wBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,UAAS;AAAA,QAAO,gBAAAC,MAAC,UAAM;AAAA,YAAE,SAAS,QAAQ,CAAC;AAAA,UAAE;AAAA,WAAE;AAAA,SAAO;AAAA,MACpH,gBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,wBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,IAAG;AAAA,QAAO,gBAAAC,MAAC,UAAM;AAAA,YAAE,GAAG,QAAQ,CAAC;AAAA,UAAE;AAAA,WAAE;AAAA,SAAO;AAAA,MACxG,gBAAAD,KAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAAG,0BAAAA,KAAC,kBAAe,SAAS,EAAE,SAAS,GAAE;AAAA,OAC1E;AAAA,EAEJ;AACA,SACE,gBAAAC,MAAC,SAAI,OAAO,EAAE,aAAa,OAAO,GAChC;AAAA,oBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,WAAU;AAAA,MAAO,gBAAAA,KAAC,UAAM,YAAE,WAAU;AAAA,OAAO;AAAA,IACzG,gBAAAC,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,QAAO;AAAA,MAAO,gBAAAA,KAAC,mBAAgB,QAAQ,EAAE,QAAQ,cAAc,EAAE,cAAc;AAAA,OAAE;AAAA,IAC9I,EAAE,WAAW,WAAW,EAAE,gBAAgB,EAAE,aAAa,SAAS,KACjE,gBAAAC,MAAC,SAAI,OAAO,EAAE,GAAG,gBAAgB,GAAG,UAAU,GAAG;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,cAAa;AAAA,MAAO,gBAAAA,KAAC,UAAM,YAAE,aAAa,KAAK,IAAI,GAAE;AAAA,OAAO;AAAA,IAEjJ,gBAAAC,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,UAAS;AAAA,MAAO,gBAAAC,MAAC,UAAM;AAAA,UAAE,SAAS,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OAAO;AAAA,IACpH,gBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,IAAG;AAAA,MAAO,gBAAAC,MAAC,UAAM;AAAA,UAAE,GAAG,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OAAO;AAAA,KAC1G;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA,QAAQ;AACV,GAIG;AACD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,WAAW,IAAI,MAAM,GAAG,KAAK;AACnC,QAAM,CAAC,QAAQ,SAAS,IAAIG,UAAuB,QAAQ;AAC3D,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAEhD,YAAU,MAAM;AACd,QAAI,CAAC,gBAAgB,SAAS,WAAW,EAAG;AAC5C,QAAI,YAAY;AAChB,iBAAa,IAAI;AACjB,YAAQ,IAAI,SAAS,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,EAC7C,KAAK,CAAC,aAAa;AAClB,UAAI,CAAC,UAAW,WAAU,QAAQ;AAAA,IACpC,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC,EACd,QAAQ,MAAM;AACb,UAAI,CAAC,UAAW,cAAa,KAAK;AAAA,IACpC,CAAC;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,SACE,gBAAAH,MAAAF,WAAA,EACG;AAAA,iBACC,gBAAAC,KAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,UAAU,QAAQ,cAAc,MAAM,GAChE,YAAE,qBACL;AAAA,IAED,OAAO,WAAW,IACjB,gBAAAA,KAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GAAI,YAAE,SAAQ,IAE1C,OAAO,IAAI,CAAC,GAAG,MACb,gBAAAC,MAAC,SAAY,OAAO,EAAE,GAAG,gBAAgB,GAAG,UAAU,GACnD;AAAA,QAAE,SAAS,gBAAAD,KAAC,UAAM,YAAE,QAAO,IAAU,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAI,YAAE,WAAU;AAAA,MACnF,gBAAAC,MAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAI;AAAA,UAAE;AAAA,QAAK;AAAA,QAAE,EAAE;AAAA,QAAK;AAAA,QAAE,EAAE;AAAA,SAAI;AAAA,SAFjD,CAGV,CACD;AAAA,KAEL;AAEJ;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAD,KAAC,SAAI,OAAO,EAAE,aAAa,OAAO,GAChC,0BAAAA,KAAC,eAAY,KAAK,EAAE,OAAO,cAA4B,GACzD;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AACF,GAGG;AACD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,CAAC,QAAQ,SAAS,IAAII,UAAuB,YAAY,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAElF,YAAU,MAAM;AACd,QAAI,CAAC,aAAc;AACnB,QAAI,YAAY;AAChB,YAAQ,IAAI,YAAY,IAAI,CAAC,MAAM,aAAa,EAAE,KAAK,CAAC,CAAC,EACtD,KAAK,CAAC,aAAa;AAClB,UAAI,CAAC,UAAW,WAAU,QAAQ;AAAA,IACpC,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC;AACjB,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,SACE,gBAAAH,MAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B;AAAA,oBAAAD,KAAC,SAAI,OAAO,EAAE,GAAG,kBAAkB,eAAe,aAAa,UAAU,QAAQ,eAAe,SAAS,cAAc,OAAO,OAAO,UAAU,GAAI,YAAE,cAAa;AAAA,IAClK,gBAAAA,KAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,UAAU,QAAQ,cAAc,MAAM,GAAI,YAAE,kBAAiB;AAAA,IACzF,YAAY,IAAI,CAAC,GAAG,MAAM;AACzB,YAAM,IAAI,OAAO,CAAC,KAAK,EAAE;AACzB,YAAM,MAAM,KAAK,MAAM,EAAE,YAAY,GAAG;AACxC,aACE,gBAAAC,MAAC,SAAY,OAAO,EAAE,GAAG,WAAW,SAAS,SAAS,WAAW,IAAI,IAAI,uBAAuB,OAAO,GACrG;AAAA,wBAAAA,MAAC,SACC;AAAA,0BAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,WAAW,YAAY,IAAI,GAAI,YAAE,UAAU,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAI,YAAE,WAAU,GAAQ;AAAA,UACtH,gBAAAC,MAAC,UAAK,OAAO,EAAE,OAAO,eAAe,QAAQ,YAAY,MAAM,GAAI;AAAA;AAAA,YAAI;AAAA,aAAC;AAAA,UACxE,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,QAAQ,YAAY,MAAM,GAAG;AAAA;AAAA,YAAE,EAAE;AAAA,YAAY;AAAA,aAAC;AAAA,WACtE;AAAA,QACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,WAAW,YAAqB,GAAI;AAAA,YAAE;AAAA,UAAK;AAAA,UAAE,EAAE;AAAA,UAAK;AAAA,UAAE,EAAE;AAAA,WAAI;AAAA,WANjF,CAOV;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AACF,GAGG;AACD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,IAAI,CAAC;AACtF,SACE,gBAAAA,MAAC,SAAI,OAAO,EAAE,aAAa,OAAO,GAChC;AAAA,oBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,SAAQ;AAAA,MAAO,gBAAAC,MAAC,UAAM;AAAA,UAAE,GAAG,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OAAO;AAAA,IAC7G,gBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,OAAM;AAAA,MAAO,gBAAAC,MAAC,UAAO;AAAA,WAAE,KAAK,EAAE,UAAU,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OAAO;AAAA,IAC1H,gBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,UAAS;AAAA,MAAO,gBAAAC,MAAC,UAAM;AAAA,UAAE,SAAS,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OAAO;AAAA,IACnH,OAAO,EAAE,qBAAqB,YAC7B,gBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,cAAa;AAAA,MAAO,gBAAAC,MAAC,UAAM;AAAA,UAAE,iBAAiB,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OAAO;AAAA,IAEjI,EAAE,gBAAgB,UAAa,EAAE,YAAY,SAAS,KACrD,gBAAAD,KAAC,gBAAa,aAAa,EAAE,aAAa,cAA4B;AAAA,IAEvE,EAAE,YAAY,UACb,gBAAAC,MAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B;AAAA,sBAAAD,KAAC,SAAI,OAAO,EAAE,GAAG,kBAAkB,eAAe,aAAa,UAAU,QAAQ,eAAe,SAAS,cAAc,MAAM,GAAI,YAAE,SAAQ;AAAA,MAC1I,QAAQ,WAAW,IAClB,gBAAAA,KAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GAAI,YAAE,WAAU,IAE5C,QAAQ,IAAI,CAAC,QAAQ,MACnB,gBAAAC,MAAC,SAAY,OAAO,EAAE,GAAG,WAAW,SAAS,SAAS,WAAW,IAAI,IAAI,uBAAuB,OAAO,GACrG;AAAA,wBAAAA,MAAC,SACC;AAAA,0BAAAD,KAAC,UAAM,iBAAO,sBAAsB,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAI,YAAE,WAAU,GAAQ;AAAA,UACzF,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,WAAW,YAAY,MAAM,GAAI,iBAAO,aAAY;AAAA,UAC1E,gBAAAC,MAAC,UAAK,OAAO,EAAE,OAAO,eAAe,QAAQ,YAAY,MAAM,GAAI;AAAA,mBAAO,SAAS,QAAQ,CAAC;AAAA,YAAE;AAAA,aAAE;AAAA,WAClG;AAAA,QACC,OAAO,aACN,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,WAAW,YAAqB,GAC1D;AAAA,iBAAO;AAAA,UAAW,OAAO,gBAAgB,IAAI,IAAI,OAAO,YAAY,KAAK;AAAA,WAC5E;AAAA,QAED,OAAO,WAAW,gBAAAA,MAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GAAI;AAAA,YAAE;AAAA,UAAQ;AAAA,UAAG,OAAO;AAAA,WAAQ;AAAA,WAXvE,CAYV,CACD;AAAA,OAEL;AAAA,IAED,EAAE,YAAY,UAAa,EAAE,MAAM,SAAS,KAC3C,gBAAAD,KAAC,SAAI,OAAO,EAAE,WAAW,MAAM,GAC7B,0BAAAA,KAAC,eAAY,KAAK,EAAE,OAAO,cAA4B,OAAO,GAAG,GACnE;AAAA,KAEJ;AAEJ;AAEA,IAAM,0BAA0B,EAAE,OAAO,WAAW,YAAY,WAAW,cAAc,UAAU;AAEnG,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AACF,GAGG;AACD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,QAAQ,KAAK,IAAI,EAAE,UAAU,CAAC;AACpC,QAAM,SAAyD;AAAA,IAC7D,EAAE,OAAO,EAAE,YAAY,IAAI,EAAE,YAAY,OAAO,wBAAwB,MAAM;AAAA,IAC9E,EAAE,OAAO,EAAE,gBAAgB,IAAI,EAAE,YAAY,OAAO,wBAAwB,WAAW;AAAA,IACvF,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE,cAAc,OAAO,wBAAwB,aAAa;AAAA,EAC3F;AACA,SACE,gBAAAC,MAAC,SAAI,OAAO,EAAE,aAAa,OAAO,GAChC;AAAA,oBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,kBAAiB;AAAA,MAAO,gBAAAC,MAAC,UAAM;AAAA,UAAE;AAAA,QAAW,EAAE,SAAS,SAAM,EAAE,MAAM,KAAK;AAAA,SAAG;AAAA,OAAO;AAAA,IAClJ,gBAAAA,MAAC,SAAI,OAAO,gBAAgB;AAAA,sBAAAD,KAAC,UAAK,OAAO,kBAAmB,YAAE,UAAS;AAAA,MAAO,gBAAAC,MAAC,UAAM;AAAA,UAAE,SAAS,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OAAO;AAAA,IACpH,gBAAAD,KAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,QAAQ,QAAQ,cAAc,OAAO,UAAU,UAAU,QAAQ,aAAa,YAAY,UAAU,GAChI,iBAAO,IAAI,CAAC,GAAG,MACd,gBAAAA,KAAC,SAAY,OAAO,EAAE,OAAO,GAAI,EAAE,KAAK,QAAS,GAAG,KAAK,YAAY,EAAE,MAAM,KAAnE,CAAsE,CACjF,GACH;AAAA,IACC,OAAO,IAAI,CAAC,GAAG,MACd,gBAAAC,MAAC,SAAY,OAAO,gBAClB;AAAA,sBAAAA,MAAC,UAAK,OAAO,EAAE,GAAG,kBAAkB,SAAS,eAAe,YAAY,UAAU,KAAK,MAAM,GAC3F;AAAA,wBAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,OAAO,QAAQ,OAAO,cAAc,OAAO,YAAY,EAAE,OAAO,MAAM,UAAU,GAAG;AAAA,QACxG,EAAE;AAAA,SACL;AAAA,MACA,gBAAAC,MAAC,UAAM;AAAA,UAAE,GAAG,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,SALjB,CAMV,CACD;AAAA,IACA,EAAE,gBAAgB,UAAa,EAAE,YAAY,SAAS,KACrD,gBAAAD,KAAC,gBAAa,aAAa,EAAE,aAAa,cAA4B;AAAA,KAE1E;AAEJ;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AACF,GAGG;AACD,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AAAiB,aAAO,gBAAAA,KAAC,sBAAmB,GAAM,cAA4B;AAAA,IACnF,KAAK;AAAgB,aAAO,gBAAAA,KAAC,qBAAkB,GAAM;AAAA,IACrD,KAAK;AAAa,aAAO,gBAAAA,KAAC,kBAAe,GAAM,cAA4B;AAAA,IAC3E,KAAK;AAAe,aAAO,gBAAAA,KAAC,qBAAkB,GAAM,cAA4B;AAAA,IAChF,KAAK;AAAW,aAAO,gBAAAA,KAAC,iBAAc,GAAM;AAAA,IAC5C,KAAK;AAAa,aAAO,gBAAAA,KAAC,kBAAe,GAAM;AAAA,IAC/C,KAAK;AAAU,aAAO,gBAAAA,KAAC,gBAAa,GAAM;AAAA,EAC5C;AACF;AAEA,SAAS,YAAY,EAAE,KAAK,MAAM,GAAsC;AACtE,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe;AAAA,MACf,cAAY,EAAE,cAAc,GAAG;AAAA,MAC/B,OAAO,SAAS;AAAA,MAChB,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY,eAAe,GAAG;AAAA,QAC9B,MAAM;AAAA,QACN,WAAW,QAAQ,SAAS,gCAAgC;AAAA,MAC9D;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,YAAY,EAAE,OAAO,GAAuB;AACnD,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,MAAI,OAAO,SAAS,aAAa;AAC/B,UAAM,SAAS,eAAe,OAAO,MAAM,OAAO,KAAK;AACvD,UAAM,OAAOG,gBAAe,OAAO,IAAI;AACvC,WACE,gBAAAF,MAAC,UACC;AAAA,sBAAAD,KAAC,aAAU,QAAgB;AAAA,MAC3B,gBAAAA,KAAC,YAAQ,iBAAO,MAAK;AAAA,MAAS;AAAA,MAAG,OAAO,MAAM,QAAQ,CAAC;AAAA,MAAG;AAAA,OAC5D;AAAA,EAEJ;AACA,QAAM,MAAM,kBAAkB,MAAM;AACpC,QAAM,QAAQ,eAAe,GAAG;AAChC,MAAI,OAAO,SAAS,aAAa;AAC/B,WACE,gBAAAC,MAAC,UAAK;AAAA;AAAA,MACD,OAAO,GAAG,QAAQ,CAAC;AAAA,MAAE;AAAA,MAAc;AAAA,MACtC,gBAAAA,MAAC,UAAK,OAAO,EAAE,MAAM,GAAI;AAAA,eAAO,SAAS,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,OACxD;AAAA,EAEJ;AACA,MAAI,OAAO,SAAS,iBAAiB;AACnC,UAAM,QAAQ,OAAO,SAAS;AAC9B,WACE,gBAAAA,MAAC,UAAK;AAAA;AAAA,MACD,OAAO,GAAG,QAAQ,CAAC;AAAA,MAAE;AAAA,MAAc;AAAA,MACtC,gBAAAA,MAAC,UAAK,OAAO,EAAE,MAAM,GAAI;AAAA,eAAO,SAAS,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,MACrD,QAAQ,KACP,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAG;AAAA;AAAA,QAAI,EAAE,eAAe,KAAK;AAAA,SAAE;AAAA,OAEhE;AAAA,EAEJ;AACA,MAAI,OAAO,SAAS,gBAAgB;AAClC,WACE,gBAAAA,MAAC,UAAK;AAAA;AAAA,MACD,OAAO,GAAG,QAAQ,CAAC;AAAA,MAAE;AAAA,MAAW;AAAA,MACnC,gBAAAD,KAAC,UAAK,OAAO,EAAE,MAAM,GAAI,oBAAU,OAAO,KAAK,GAAE;AAAA,MAChD;AAAA,MAAO,EAAE,YAAY,OAAO,QAAQ,MAAM;AAAA,OAC7C;AAAA,EAEJ;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,WACE,gBAAAC,MAAC,UAAK,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,MAAM,GACtE;AAAA,sBAAAD,KAAC,YAAQ,iBAAO,WAAU;AAAA,MAC1B,gBAAAA,KAAC,mBAAgB,QAAQ,OAAO,QAAQ,cAAc,OAAO,cAAc;AAAA,MAC3E,gBAAAC,MAAC,UAAK,OAAO,EAAE,MAAM,GAAI;AAAA,eAAO,SAAS,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,MACrD,OAAO,SAAS,OAAO,QAAQ,KAC9B,gBAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAI,YAAE,kBAAkB,OAAO,KAAK,GAAE;AAAA,OAEvE;AAAA,EAEJ;AACA,MAAI,OAAO,SAAS,WAAW;AAC7B,UAAM,MAAM,OAAO,IAAI,SAAS,KAAK,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,QAAQ,OAAO;AAC9E,WACE,gBAAAC,MAAC,UACE;AAAA;AAAA,MAAI;AAAA,MAAG,gBAAAA,MAAC,UAAK,OAAO,EAAE,MAAM,GAAI;AAAA,eAAO,SAAS,QAAQ,CAAC;AAAA,QAAE;AAAA,SAAE;AAAA,MAC7D,OAAO,YAAY,gBAAAA,MAAC,UAAK,OAAO,EAAE,OAAO,eAAe,KAAK,GAAG;AAAA;AAAA,QAAI,EAAE;AAAA,SAAS;AAAA,OAClF;AAAA,EAEJ;AACA,SAAO,gBAAAD,KAAC,UAAM,kBAAQ,MAAM,GAAE;AAChC;AAKA,SAAS,oBAAoB,MAA2B;AACtD,SAAO,SAAS,YAAY,SAAS;AACvC;AAEA,SAAS,sBAAsB,SAA6B;AAC1D,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AACjC,UAAM,KAAK,aAAa,kBAAkB,CAAC,CAAC;AAC5C,UAAM,KAAK,aAAa,kBAAkB,CAAC,CAAC;AAC5C,QAAI,OAAO,GAAI,QAAO,KAAK;AAC3B,WAAO,EAAE,SAAS,eAAe,EAAE,SAAS,cAAc,KAAM,QAAQ,IAAI,EAAE,KAAK,MAAM,QAAQ,IAAI,EAAE,KAAK;AAAA,EAC9G,CAAC;AACH;AAQA,SAAS,kBAAkB,QAA+B;AAGxD,QAAM,aAAa;AAAA,IACjB,GAAG;AAAA,IACH,SAAS,OAAO,QAAQ,IAAI,CAAC,MAAM;AACjC,UAAI,EAAE,SAAS,mBAAmB,EAAE,SAAS,aAAa;AACxD,eAAO,EAAE,GAAG,GAAG,OAAO,EAAE,MAAM;AAAA,MAChC;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,QAAM,OAAO,KAAK,UAAU,YAAY,MAAM,CAAC;AAC/C,QAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC1D,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,MAAI;AACF,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,WAAW,oBAAmB,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,CAAC;AAC9E,aAAS,KAAK,YAAY,CAAC;AAC3B,MAAE,MAAM;AACR,aAAS,KAAK,YAAY,CAAC;AAAA,EAC7B,UAAE;AACA,eAAW,MAAM,IAAI,gBAAgB,GAAG,GAAG,GAAI;AAAA,EACjD;AACF;AAEA,SAAS,aAAa,SAAmB,MAAiB,MAAiC;AACzF,MAAI,SAAS,iBAAiB;AAC5B,WAAO,QAAQ,IAAI,CAAC,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE;AAAA,EAC/E;AACA,MAAI,SAAS,eAAe,SAAS,UAAU;AAC7C,UAAM,SAAS,oBAAI,IAAsB;AAGzC,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,SAAS,SAAU;AACzB,iBAAW,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG;AAChC,YAAI,CAAC,OAAO,IAAI,EAAE,SAAS,EAAG,QAAO,IAAI,EAAE,WAAW,CAAC,CAAC;AACxD,eAAO,IAAI,EAAE,SAAS,EAAG,KAAK,CAAC;AAAA,MACjC;AAAA,IACF;AACA,WAAO,MAAM,KAAK,OAAO,QAAQ,CAAC,EAC/B,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EACxC,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,SAAS,KAAK,EAAE;AAAA,EAC1E;AACA,MAAI,SAAS,YAAY,SAAS,UAAU;AAE1C,WAAO,QACJ,OAAO,CAAC,MAAyB,EAAE,SAAS,QAAQ,EACpD,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,EACtC,IAAI,CAAC,MAAM;AACV,YAAM,OAAO,EAAE,WAAW,CAAC,CAAC;AAC5B,aAAO,EAAE,OAAO,EAAE,WAAW,OAAO,KAAK,QAAQ,SAAS,KAAK;AAAA,IACjE,CAAC;AAAA,EACL;AACA,MAAI,SAAS,YAAY,SAAS,iBAAiB;AACjD,UAAM,WAAW,oBAAI,IAAsB;AAC3C,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,SAAS,gBAAiB;AAChC,YAAM,MAAM,EAAE,MAAM,CAAC;AACrB,YAAM,IAAI,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK;AACvD,UAAI,CAAC,SAAS,IAAI,CAAC,EAAG,UAAS,IAAI,GAAG,CAAC,CAAC;AACxC,eAAS,IAAI,CAAC,EAAG,KAAK,CAAC;AAAA,IACzB;AACA,WAAO,MAAM,KAAK,SAAS,QAAQ,CAAC,EACjC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EACxC,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,EAAE,OAAO,OAAO,KAAK,QAAQ,SAAS,KAAK,EAAE;AAAA,EAC1E;AACA,SAAO,QAAQ,IAAI,CAAC,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,OAAO,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE;AAC/E;AAUA,SAAS,UAAU,EAAE,QAAQ,UAAU,gBAAgB,iBAAiB,aAAa,GAAmB;AACtG,QAAM,cAAc,OAAO,SAAS,kBAAkB,OAAO,QAAQ,SAAS;AAC9E,QAAM,MAAM,kBAAkB,MAAM;AACpC,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,SAAS;AAAA,MACT,cAAc,MAAM;AAClB,YAAI,eAAe,OAAO,SAAS,eAAgB,iBAAgB,MAAM;AAAA,MAC3E;AAAA,MACA,cAAc,MAAM;AAClB,YAAI,YAAa,iBAAgB,IAAI;AAAA,MACvC;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY,aAAa,QAAQ,QAAQ,gBAAgB,eAAe,GAAG,CAAC;AAAA,QAC5E,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,MAEA;AAAA,wBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC9D;AAAA,0BAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,QAAQ,OAAO,OAAO,GAAI,qBAAW,WAAM,UAAI;AAAA,UACrE,gBAAAA,KAAC,eAAY,KAAU;AAAA,UACvB,gBAAAA,KAAC,eAAY,QAAgB;AAAA,WAC/B;AAAA,QACC,YACC,gBAAAA,KAAC,SAAI,OAAO,EAAE,WAAW,OAAO,YAAY,OAAO,WAAW,qBAAqB,GACjF,0BAAAA,KAAC,gBAAa,GAAG,QAAQ,cAA4B,GACvD;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,eAAe,EAAE,QAAQ,GAAgC;AAChE,QAAM,WAAW,QAAQ,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,KAAK,GAAG,QAAQ;AACxE,SACE,gBAAAA,KAAC,SACE,kBAAQ,IAAI,CAAC,GAAG,MAAM;AACrB,UAAM,UAAU,EAAE,QAAQ,YAAY;AACtC,UAAM,YAAY,EAAE,WAAW;AAC/B,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO;AAAA,UACL,YAAY,GAAG,MAAM;AAAA,UACrB,SAAS;AAAA,UACT,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,QACP;AAAA,QAEA;AAAA,0BAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,YAAY,oBAAoB,SAAS,OAAO,GACnE,YAAE,QAAQ,WAAW,WAAM,UAC9B;AAAA,UACA,gBAAAA,KAAC,YAAQ,YAAE,WAAU;AAAA,UACrB,gBAAAA,KAAC,mBAAgB,QAAQ,EAAE,QAAQ,cAAc,EAAE,cAAc;AAAA,UACjE,gBAAAC,MAAC,UAAK,OAAO,EAAE,OAAO,OAAO,GAAI;AAAA,cAAE,SAAS,QAAQ,CAAC;AAAA,YAAE;AAAA,aAAE;AAAA;AAAA;AAAA,MAdpD;AAAA,IAeP;AAAA,EAEJ,CAAC,GACH;AAEJ;AAIA,SAAS,iBAAiB;AACxB,QAAM,EAAE,MAAM,SAAS,EAAE,IAAI,QAAQ;AACrC,QAAM,QAAgB,CAAC,MAAM,IAAI;AACjC,QAAM,SAA+B,EAAE,IAAI,MAAM,IAAI,SAAI;AACzD,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY,EAAE;AAAA,MACd,OAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,UAAU;AAAA,MACZ;AAAA,MAEC,gBAAM,IAAI,CAAC,MAAM;AAChB,cAAM,SAAS,SAAS;AACxB,eACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,gBAAc;AAAA,YACd,aAAW;AAAA,YACX,SAAS,MAAM,QAAQ,CAAC;AAAA,YACxB,OAAO;AAAA,cACL,YAAY,SAAS,YAAY;AAAA,cACjC,OAAO,SAAS,YAAY;AAAA,cAC5B,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,SAAS;AAAA,cACT,YAAY,SAAS,MAAM;AAAA,YAC7B;AAAA,YAEC,iBAAO,CAAC;AAAA;AAAA,UAfJ;AAAA,QAgBP;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,MAAM,OAAmB;AACvC,QAAM,EAAE,QAAQ,SAAS,WAAW,gBAAgB,aAAa,IAAI;AACrE,QAAM,EAAE,EAAE,IAAI,QAAQ;AACtB,QAAM,UAAUK,SAAQ,MAAM,YAAY,OAAO,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC;AAC3E,QAAM,eAAe,WAAW,OAAO,CAAC,MAAM,QAAQ,CAAC,EAAE,SAAS,CAAC;AACnE,QAAM,qBACJ,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,MAChD,OAAO,aAAa,UAAU,KAAK,MACnC,OAAO,QAAQ,UAAU,KAAK;AACjC,QAAM,CAAC,WAAW,YAAY,IAAID;AAAA,IAChC,aAAa,CAAC,KAAK;AAAA,EACrB;AACA,QAAM,aAAgC,cAAc,aAAa,OAAO;AACxE,QAAM,gBAAgB,CAAC,MAAkB,aAAa,CAAC;AACvD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAwB,IAAI;AAClE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAiD,CAAC,CAAC;AACrF,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAgD,CAAC,CAAC;AAClF,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA8C,CAAC,CAAC;AACpF,QAAM,qBAAqBE,QAAO,CAAC;AAEnC,YAAU,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3C,WAAS,YAAY,QAAkC;AACrD,QAAI,CAAC,QAAQ;AACX,eAAS,IAAI,GAAG,IAAI,mBAAmB,SAAS,KAAK;AACnD,oBAAY,UAAU,CAAC,EAAE;AACzB,oBAAY,eAAe,CAAC,EAAE;AAC9B,kBAAU,gBAAgB,CAAC,EAAE;AAAA,MAC/B;AACA,yBAAmB,UAAU;AAC7B;AAAA,IACF;AACA,UAAM,MAAM,kBAAkB,MAAM;AACpC,UAAM,QAAQ,uBAAuB,GAAG;AACxC,UAAM,YAAY,QAAQ,SAAS,MAAM,QAAQ,WAAW,OAAO;AACnE,UAAM,WAAW,UAAU,OAAO,SAAS;AAC3C,WAAO,QAAQ,QAAQ,CAAC,GAAG,MAAM;AAI/B,UAAI,EAAE,SAAS,KAAK,EAAE,UAAU,EAAG;AACnC,kBAAY,UAAU,CAAC,IAAI,GAAG,EAAE,QAAQ,OAAO,MAAM,SAAS,CAAC;AAC/D,YAAM,OAAO,OAAO,kBAAkB,CAAC,KAAK;AAC5C,UAAI,QAAQ,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AAC7C,oBAAY,eAAe,CAAC,IAAI,MAAM;AAAA,UACpC,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AACD,cAAM,OAAO,EAAE,GAAG,KAAK,IAAI,KAAK,QAAQ,GAAG,GAAG,KAAK,IAAI,KAAK,SAAS,EAAE;AACvE,cAAM,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AACzD,cAAM,KAAK,GAAG,IAAI,KAAK;AACvB,cAAM,KAAK,GAAG,IAAI,KAAK;AACvB,YAAI,KAAK,MAAM,IAAI,EAAE,IAAI,GAAG;AAC1B,oBAAU,gBAAgB,CAAC,IAAI,MAAM,IAAI,KAAK;AAAA,QAChD;AAAA,MACF;AAAA,IACF,CAAC;AACD,uBAAmB,UAAU,OAAO,QAAQ;AAAA,EAC9C;AAEA,QAAM,aAAa;AAAA,IACjB,UAAU;AAAA,IACV,GAAGJ,iBAAgB,QAAQ;AAAA,IAC3B,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AAEA,SACE,gBAAAD,MAAC,SAAI,MAAK,UAAS,cAAY,EAAE,aAAa,OAAO,YACnD;AAAA,oBAAAA,MAAC,YAAO,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,cAAc,MAAM,GAC3G;AAAA,sBAAAD,KAAC,YAAO,6BAAe;AAAA,MACvB,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,YAAY,SAAS,GAC9D;AAAA,wBAAAD,KAAC,kBAAe;AAAA,QAChB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,EAAE;AAAA,YACd,SAAS,MAAM,kBAAkB,MAAM;AAAA,YACvC,OAAO,EAAE;AAAA,YACT,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,SAAS;AAAA,YACX;AAAA,YAEC,YAAE;AAAA;AAAA,QACL;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,EAAE;AAAA,YACd,SAAS;AAAA,YACT,OAAO,EAAE,YAAY,eAAe,OAAO,WAAW,QAAQ,QAAQ,QAAQ,WAAW,UAAU,OAAO;AAAA,YAC3G;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAEC,aAAa,WAAW,KACvB,gBAAAA,KAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GAAI,YAAE,WAAU;AAAA,IAG7C,aAAa,SAAS,KACrB,gBAAAC,MAAAF,WAAA,EACE;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,OAAO;AAAA,UAChB;AAAA,UACA;AAAA,UACA,aAAa,CAAC,MAAM;AAAE,yBAAa,CAAC;AAAG,2BAAe,IAAI;AAAA,UAAE;AAAA;AAAA,MAC9D;AAAA,MACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,UAAU,QAAQ,cAAc,MAAM,GAC9E;AAAA,8BACC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,aAAU;AAAA,YACV,SAAS,MAAM;AAAE,2BAAa,UAAU;AAAG,6BAAe,IAAI;AAAA,YAAE;AAAA,YAChE,OAAO;AAAA,cACL,YAAY,cAAc,aAAa,YAAY;AAAA,cACnD,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,UAAU;AAAA,YACZ;AAAA,YAEC,YAAE;AAAA;AAAA,UAdC;AAAA,QAeN;AAAA,QAED,aAAa,IAAI,CAAC,SAAS;AAC1B,gBAAM,QAAQ,cAAc,QAAQ,IAAI,CAAC;AACzC,gBAAM,SAAS,eAAe;AAC9B,iBACE,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,aAAW;AAAA,cACX,uBAAqB;AAAA,cACrB,SAAS,MAAM;AAAE,6BAAa,IAAI;AAAG,+BAAe,IAAI;AAAA,cAAE;AAAA,cAC1D,OAAO;AAAA,gBACL,YAAY,SAAS,YAAY;AAAA,gBACjC,OAAO;AAAA,gBACP,QAAQ,aAAa,UAAU,QAAQ,YAAY,eAAe,KAAK,CAAC;AAAA,gBACxE,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,cACP;AAAA,cAEC;AAAA,0BAAU,SAAS,gBAAAD,KAAC,eAAY,KAAK,OAAO,OAAO,EAAE,WAAW,KAAK,GAAG;AAAA,gBACxE,EAAE,UAAU,IAAI;AAAA,gBAAE;AAAA,gBAAE,QAAQ,IAAI,EAAE;AAAA;AAAA;AAAA,YAnB9B;AAAA,UAoBP;AAAA,QAEJ,CAAC;AAAA,SACH;AAAA,MAEC,cAAc,cAAc,cAC3B,gBAAAC,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,QAAQ,cAAc,OAAO,UAAU,QAAQ,OAAO,QAAQ,UAAU,OAAO,GACvI;AAAA,wBAAAA,MAAC,WAAM,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC/D;AAAA,YAAE;AAAA,UACH,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,cAAY,EAAE;AAAA,cACd,OAAO,SAAS,UAAU,KAAK;AAAA,cAC/B,UAAU,CAAC,MAAM;AACf,sBAAM,IAAK,EAAE,OAA6B;AAC1C,4BAAY,EAAE,GAAG,UAAU,CAAC,UAAU,GAAG,EAAE,CAAC;AAC5C,+BAAe,IAAI;AAAA,cACrB;AAAA,cACA,OAAO,EAAE,YAAY,WAAW,OAAO,WAAW,QAAQ,qBAAqB,cAAc,OAAO,SAAS,WAAW,UAAU,OAAO;AAAA,cAEzI;AAAA,gCAAAD,KAAC,YAAO,OAAM,iBAAiB,YAAE,mBAAkB;AAAA,gBACnD,gBAAAA,KAAC,YAAO,OAAM,YAAY,YAAE,cAAa;AAAA;AAAA;AAAA,UAC3C;AAAA,WACF;AAAA,QACC,oBAAoB,UAAU,KAC7B,gBAAAC,MAAC,WAAM,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC/D;AAAA,YAAE;AAAA,UACH,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,cAAY,EAAE;AAAA,cACd,OAAO,UAAU,UAAU,KAAK;AAAA,cAChC,UAAU,CAAC,MAAM;AACf,sBAAM,IAAK,EAAE,OAA6B;AAC1C,6BAAa,EAAE,GAAG,WAAW,CAAC,UAAU,GAAG,EAAE,CAAC;AAC9C,+BAAe,IAAI;AAAA,cACrB;AAAA,cACA,OAAO,EAAE,YAAY,WAAW,OAAO,WAAW,QAAQ,qBAAqB,cAAc,OAAO,SAAS,WAAW,UAAU,OAAO;AAAA,cAEzI;AAAA,gCAAAD,KAAC,YAAO,OAAM,iBAAiB,YAAE,oBAAmB;AAAA,gBACnD,eAAe,YAAY,gBAAAA,KAAC,YAAO,OAAM,UAAU,YAAE,aAAY;AAAA,gBACjE,eAAe,YAAY,gBAAAA,KAAC,YAAO,OAAM,aAAa,YAAE,gBAAe;AAAA,gBACvE,eAAe,mBAAmB,gBAAAA,KAAC,YAAO,OAAM,UAAU,YAAE,aAAY;AAAA;AAAA;AAAA,UAC3E;AAAA,WACF;AAAA,QAEF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,EAAE;AAAA,YACd,aAAa,EAAE;AAAA,YACf,OAAO,WAAW,UAAU,KAAK;AAAA,YACjC,SAAS,CAAC,MAAM;AACd,4BAAc,EAAE,GAAG,YAAY,CAAC,UAAU,GAAI,EAAE,OAA4B,MAAM,CAAC;AACnF,6BAAe,IAAI;AAAA,YACrB;AAAA,YACA,OAAO,EAAE,YAAY,QAAQ,YAAY,WAAW,OAAO,WAAW,QAAQ,qBAAqB,cAAc,OAAO,SAAS,WAAW,UAAU,QAAQ,OAAO,QAAQ;AAAA;AAAA,QAC/K;AAAA,SACF;AAAA,MAGD,cAAc,cACb,gBAAAA,KAAC,SAAI,OAAO,EAAE,UAAU,GAAG,WAAW,QAAQ,YAAY,OAAO,eAAe,OAAO,GACrF,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,OAAO;AAAA,UAChB,UAAU,OAAO;AAAA,UACjB,WAAW,OAAO;AAAA,UAClB,aAAa,OAAO;AAAA,UACpB,QAAQ,OAAO;AAAA,UACf,QAAQ,CAAC,MAAM;AACb,yBAAa,EAAE,IAAI;AACnB,kBAAM,UAAU,QAAQ,EAAE,IAAI;AAC9B,kBAAM,MAAM,QAAQ,QAAQ,CAAC;AAC7B,gBAAI,OAAO,EAAG,gBAAe,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE;AAAA,UACjD;AAAA;AAAA,MACF,GACF;AAAA,MAED,eAAe,YAAY,cAAc,cACxC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,QAAQ,OACd,QAAQ,CAAC,MAAO,EAAE,SAAS,WAAW,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAE,EAC5D,OAAO,CAAC,MAAM,oBAAoB,GAAG,WAAW,UAAU,EAAE,CAAC;AAAA,UAChE,UAAU,MAAM;AACd,yBAAa,EAAE,GAAG,WAAW,QAAQ,YAAY,CAAC;AAClD,2BAAe,IAAI;AAAA,UACrB;AAAA;AAAA,MACF;AAAA,MAED,eAAe,eAAe,cAAc,cAC3C,gBAAAA,KAAC,mBAAgB,SAAS,OAAO,SAAS;AAAA,MAE3C,eAAe,kBAAkB,cAAc,cAC9C,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,cAAc;AAAA,YACd,UAAU;AAAA,YACV,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,cAAc;AAAA,UAChB;AAAA,UAEC,YAAE;AAAA;AAAA,MACL;AAAA,MAED,eAAe,iBAAiB,cAAc,cAC7C,gBAAAC,MAAAF,WAAA,EACE;AAAA,wBAAAC,KAAC,cAAW,SAAS,OAAO,SAAS;AAAA,QACrC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,UAAU;AAAA,cACV,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,cAAc;AAAA,YAChB;AAAA,YAEC,YAAE;AAAA;AAAA,QACL;AAAA,SACF;AAAA,MAEF,gBAAAA,KAAC,QAAG,OAAO,EAAE,WAAW,QAAQ,QAAQ,GAAG,SAAS,GAAG,WAAW,QAAQ,UAAU,GAAG,SAAS,cAAc,aAAa,SAAS,OAAU,GAC3I,yBAAe,MAAM;AACpB,cAAM,WAAW,QAAQ,UAAU,EAAE;AAAA,UAAO,CAAC,MAC3C,oBAAoB,GAAG,WAAW,UAAU,KAAK,EAAE;AAAA,QACrD;AACA,cAAM,eAAe,SAAS,UAAU,KAAK,qBAAqB,aAC9D,sBAAsB,QAAQ,IAC9B;AACJ,eAAO,aAAa,aAAa,UAAU,UAAU,KAAK,iBAAiB,UAAU;AAAA,MACvF,GAAG,EAAE,IAAI,CAAC,GAAG,OAAO;AAClB,cAAM,cAAc,UAAU,UAAU,KAAK;AAC7C,YAAI,gBAAgB,iBAAiB;AACnC,gBAAMO,OAAM,GAAG,UAAU,IAAI,EAAE;AAC/B,iBACE,gBAAAP;AAAA,YAAC;AAAA;AAAA,cAEC,QAAQ,EAAE,QAAQ,CAAC;AAAA,cACnB,UAAU,gBAAgBO;AAAA,cAC1B,gBAAgB,MAAM,eAAe,gBAAgBA,OAAM,OAAOA,IAAG;AAAA,cACrE,iBAAiB;AAAA,cACjB;AAAA;AAAA,YALKA;AAAA,UAMP;AAAA,QAEJ;AACA,cAAM,MAAM,GAAG,UAAU,UAAU,EAAE;AACrC,cAAM,SAAS,gBAAgB;AAC/B,cAAM,YAAY,eAAe,YAAY,gBAAgB;AAC7D,cAAM,gBAAgB,EAAE,QAAQ,OAAO,CAAC,MAAyB,EAAE,SAAS,QAAQ;AACpF,cAAM,cAAc,YAAY,cAAc,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE,SAAS;AAC5F,eACE,gBAAAN;AAAA,UAAC;AAAA;AAAA,YAEC,iBAAe;AAAA,YACf,SAAS,MAAM,eAAe,SAAS,OAAO,GAAG;AAAA,YACjD,OAAO;AAAA,cACL,SAAS;AAAA,cACT,WAAW;AAAA,cACX,YAAY,cAAc,IAAI,aAAa,oBAAoB,MAAM,KAAK;AAAA,cAC1E,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,OAAO,UAAU,OAAO,GAChF;AAAA,gCAAAD,KAAC,UAAK,OAAO,EAAE,OAAO,QAAQ,OAAO,OAAO,GAAI,mBAAS,WAAM,UAAI;AAAA,gBACnE,gBAAAC,MAAC,UAAK;AAAA,kCAAAD,KAAC,YAAQ,YAAE,OAAM;AAAA,kBAAS;AAAA,kBAAG,EAAE;AAAA,mBAAM;AAAA,gBAC1C,aAAa,cAAc,KAC1B,gBAAAC,MAAC,UAAK,OAAO,EAAE,OAAO,oBAAoB,QAAQ,UAAU,OAAO,GAAG;AAAA;AAAA,kBACjE,EAAE,mBAAmB,WAAW;AAAA,mBACrC;AAAA,iBAEJ;AAAA,cACC,UACC,gBAAAD,KAAC,SAAI,OAAO,EAAE,WAAW,OAAO,YAAY,OAAO,WAAW,sBAAsB,aAAa,MAAM,GACpG,sBACC,gBAAAA,KAAC,kBAAe,SAAS,eAAe,IAExC,gBAAAC,MAAAF,WAAA,EACG;AAAA,kBAAE,QAAQ,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,OAC9B,gBAAAC,KAAC,SAAa,OAAO,EAAE,SAAS,QAAQ,GACtC,0BAAAA,KAAC,eAAY,QAAQ,GAAG,KADhB,EAEV,CACD;AAAA,gBACA,EAAE,QAAQ,SAAS,MAClB,gBAAAA,KAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,WAAW,MAAM,GAAI,YAAE,UAAU,EAAE,QAAQ,SAAS,EAAE,GAAE;AAAA,iBAEzF,GAEJ;AAAA;AAAA;AAAA,UAtCG;AAAA,QAwCP;AAAA,MAEJ,CAAC,GACH;AAAA,MACC,cACC,cAAc,eACb,WAAW,UAAU,KAAK,IAAI,KAAK,MAAM,MAC1C,QAAQ,UAAU,EAAE,SAAS,KAC7B,QAAQ,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,GAAG,WAAW,UAAU,KAAK,EAAE,CAAC,KACpF,gBAAAA,KAAC,SAAI,OAAO,EAAE,SAAS,YAAY,UAAU,QAAQ,OAAO,OAAO,GAChE,YAAE,iBACL;AAAA,OAEN;AAAA,KAEJ;AAEJ;;;AHvkCI,SAEI,OAAAQ,MAFJ,QAAAC,aAAA;AArDG,SAAS,IAAI,OAAiB;AACnC,QAAM,EAAE,UAAU,WAAW,gBAAgB,cAAc,SAAS,IAAI;AACxE,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,KAAK;AAChD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiC,IAAI;AACjE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,CAAC;AAC5C,QAAM,eAAeC,QAAe,CAAC;AACrC,QAAM,SAASA,QAAsB,IAAI;AAGzC,QAAM,iBAAiBA,QAAe,CAAC;AAEvC,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,WAAW;AACd,UAAI,OAAO,YAAY,KAAM,sBAAqB,OAAO,OAAO;AAChE;AAAA,IACF;AACA,UAAM,OAAO,MAAM;AACjB,mBAAa,YAAY,IAAI,IAAI,aAAa,OAAO;AACrD,aAAO,UAAU,sBAAsB,IAAI;AAAA,IAC7C;AACA,WAAO,UAAU,sBAAsB,IAAI;AAC3C,WAAO,MAAM;AACX,UAAI,OAAO,YAAY,KAAM,sBAAqB,OAAO,OAAO;AAAA,IAClE;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,WAAS,WAAW;AAClB,QAAI,CAAC,WAAW;AACd,mBAAa,UAAU,YAAY,IAAI;AACvC,mBAAa,CAAC;AACd,gBAAU,IAAI;AACd,eAAS,MAAM;AACf,mBAAa,IAAI;AAAA,IACnB,OAAO;AACL,YAAM,IAAI,SAAS,KAAK;AACxB,YAAM,QAAQ,EAAE,eAAe;AAC/B,mBAAa,KAAK;AAClB,gBAAU,CAAC;AACX,UAAI,UAAU;AACZ,iBAAS,CAAC,EACP,KAAK,CAAC,aAAa;AAClB,cAAI,eAAe,YAAY,MAAO,WAAU,QAAQ;AAAA,QAC1D,CAAC,EACA,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,WAAS,UAAU;AACjB,cAAU,IAAI;AAAA,EAChB;AAEA,SACE,gBAAAH,MAAC,gBACE;AAAA,eAAW,QACV,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAED,WAAW,QACV,gBAAAA,KAAC,SAAM,QAAgB,UAAoB,SAAkB,cAA4B;AAAA,KAE7F;AAEJ;;;Aa1EI,gBAAAK,aAAA;AAHG,SAAS,MAAM,MAA+B;AACnD,QAAM,EAAE,UAAU,WAAW,gBAAgB,OAAO,SAAS,MAAM,cAAc,SAAS,IAAI;AAC9F,SAAO;AAAA,IACL,gBAAAA,MAAC,OAAI,UAAoB,UAAoB,cAA4B,UAAoB;AAAA,IAC7F,EAAE,QAAQ,KAAK;AAAA,EACjB;AACF;","names":["useState","useRef","useEffect","useState","useMemo","useRef","h","jsx","jsxs","useMemo","useState","jsx","jsxs","useMemo","useState","t","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","correlate","jsx","jsxs","correlate","Fragment","jsx","jsxs","POSITION_STYLES","WEB_VITAL_UNIT","useState","useMemo","useRef","key","jsx","jsxs","useState","useRef","useEffect","jsx"]}
1
+ {"version":3,"sources":["../src/shadow-mount.ts","../src/app.tsx","../src/i18n.ts","../src/widget.tsx","../src/panel.tsx","../src/overlay.ts","../src/severity.ts","../src/summary.tsx","../src/timeline.tsx","../src/leaks.tsx","../src/render-insights.tsx","../src/inp-episode.tsx","../src/episode-shared.tsx","../src/long-task-episode.tsx","../src/filter.ts","../src/mount.tsx"],"sourcesContent":["import { render, type ComponentChild } from 'preact'\n\nconst HOST_MARKER = 'data-perfscope-host'\n\n// Thin dark scrollbar matching the panel palette. Pseudo-elements like\n// ::-webkit-scrollbar can't be set via inline styles, so we inject a\n// <style> element into the shadow root. scrollbar-width/-color cover Firefox.\nconst SCROLLBAR_CSS = `\n*::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n*::-webkit-scrollbar-track {\n background: transparent;\n}\n*::-webkit-scrollbar-thumb {\n background: #3a3a3a;\n border-radius: 4px;\n border: 2px solid transparent;\n background-clip: padding-box;\n}\n*::-webkit-scrollbar-thumb:hover {\n background: #555;\n background-clip: padding-box;\n border: 2px solid transparent;\n}\n*::-webkit-scrollbar-corner {\n background: transparent;\n}\n/* Firefox-only fallback. Chrome 121+ supports the standard scrollbar-width/\n -color too, but setting them there DISABLES the ::-webkit-scrollbar styling\n above (losing our 8px rounded thumb). Gate on lack of webkit support so only\n non-webkit engines (Firefox) pick these up. */\n@supports not selector(::-webkit-scrollbar) {\n * {\n scrollbar-width: thin;\n scrollbar-color: #3a3a3a transparent;\n }\n}\n`\n\nexport interface MountShadowOptions {\n /** Parent element under which the host div is appended. Defaults to document.body. */\n parent?: HTMLElement\n}\n\nexport function mountShadow(vnode: ComponentChild, opts: MountShadowOptions = {}): () => void {\n const parent = opts.parent ?? document.body\n const host = document.createElement('div')\n host.setAttribute(HOST_MARKER, '')\n const root = host.attachShadow({ mode: 'open' })\n parent.appendChild(host)\n render(vnode, root as unknown as Element)\n // Append after render: preact manages its own children in `root`, so adding\n // the <style> afterward keeps it outside preact's diff and prevents it from\n // being removed on re-render.\n const style = document.createElement('style')\n style.textContent = SCROLLBAR_CSS\n root.appendChild(style)\n\n let torn = false\n return () => {\n if (torn) return\n torn = true\n try {\n render(null, root as unknown as Element)\n } catch {\n // ignore\n }\n if (host.parentNode) host.parentNode.removeChild(host)\n }\n}\n","import { h } from 'preact'\nimport { useState, useRef, useEffect } from 'preact/hooks'\nimport type { Recorder, RecordingResult, StackFrame } from '@react-perfscope/core'\nimport { Widget } from './widget'\nimport { Panel } from './panel'\nimport { I18nProvider } from './i18n'\nimport type { WidgetPosition } from './types'\n\nexport interface AppProps {\n recorder: Recorder\n position?: WidgetPosition\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n finalize?: (result: RecordingResult) => Promise<RecordingResult>\n}\n\nexport function App(props: AppProps) {\n const { recorder, position = 'bottom-right', resolveFrame, finalize } = props\n const [recording, setRecording] = useState(false)\n const [result, setResult] = useState<RecordingResult | null>(null)\n const [elapsedMs, setElapsedMs] = useState(0)\n const startedAtRef = useRef<number>(0)\n const rafRef = useRef<number | null>(null)\n // Bumped on every stop; lets a slow finalize drop its result if the user\n // has already started a new recording.\n const resultTokenRef = useRef<number>(0)\n\n useEffect(() => {\n if (!recording) {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n return\n }\n const tick = () => {\n setElapsedMs(performance.now() - startedAtRef.current)\n rafRef.current = requestAnimationFrame(tick)\n }\n rafRef.current = requestAnimationFrame(tick)\n return () => {\n if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n }\n }, [recording])\n\n function onToggle() {\n if (!recording) {\n startedAtRef.current = performance.now()\n setElapsedMs(0)\n setResult(null)\n recorder.start()\n setRecording(true)\n } else {\n const r = recorder.stop()\n const token = ++resultTokenRef.current\n setRecording(false)\n setResult(r)\n if (finalize) {\n finalize(r)\n .then((enriched) => {\n if (resultTokenRef.current === token) setResult(enriched)\n })\n .catch(() => {})\n }\n }\n }\n\n function onClose() {\n setResult(null)\n }\n\n return (\n <I18nProvider>\n {result === null && (\n <Widget\n recording={recording}\n elapsedMs={elapsedMs}\n onToggle={onToggle}\n position={position}\n />\n )}\n {result !== null && (\n <Panel result={result} position={position} onClose={onClose} resolveFrame={resolveFrame} />\n )}\n </I18nProvider>\n )\n}\n","import { h, createContext, type ComponentChildren } from 'preact'\nimport { useContext, useState, useCallback, useMemo } from 'preact/hooks'\nimport type { SignalKind, HeapTrendClass } from '@react-perfscope/core'\n\nexport type Lang = 'en' | 'ko'\n\nexport const STORAGE_KEY = 'react-perfscope-lang'\n\n// Signal-kind *identifiers* (forced-reflow, layout-shift, …) stay as-is in\n// data attributes and internal logic, but their *display* labels go through\n// `kindLabel`. Web-vital metric names (LCP, INP, …) and units (ms, KB) are\n// never translated — they are standard web-perf terms.\nexport interface Strings {\n save: string\n saveAria: string\n saveTitle: string\n closeAria: string\n noSignals: string\n sort: string\n sortChronological: string\n sortSeverity: string\n filterPlaceholder: string\n filterAria: string\n filterNoMatches: string\n groupBy: string\n groupChronological: string\n groupComponent: string\n groupSource: string\n groupCommit: string\n timeline: string\n // detail labels\n value: string\n started: string\n duration: string\n size: string\n bytes: string\n renderBlocking: string\n metric: string\n component: string\n reason: string\n at: string\n ended: string\n yes: string\n no: string\n rect: string\n noSourceRects: string\n noStack: string\n resolvingSourceMaps: string\n anonymous: string\n blocking: string\n sourceCount: (n: number) => string\n moreItems: (n: number) => string\n /** Badge on a coalesced forced-reflow showing how many reads it merged. */\n coalescedReads: (n: number) => string\n /** Badge on a commit render showing how many components re-rendered. */\n cascadeComponents: (n: number) => string\n // widget\n startRecording: string\n stopRecording: string\n rec: string\n // summary\n signalsTitle: (n: number, kind: string) => string\n // timeline\n noTimeBound: string\n timeAxis: string\n // heap\n heapLabel: string\n heapUnsupported: string\n heapExtensionHint: string\n heapTrendLabel: (cls: HeapTrendClass) => string\n // leaks\n leaksTitle: string\n leakHint: string\n leakSuspect: (component: string, retained: number, unmounted: number) => string\n // frame rate\n fpsLabel: string\n fpsUnsupported: string\n fpsBadge: (minFps: number, dropped: number) => string\n fpsWorst: (ms: number) => string\n // render insights\n topRenderers: string\n moreComponents: (n: number) => string\n rendererDetail: (component: string, count: number, totalMs: number, maxMs: number) => string\n // aria / tooltips\n language: string\n panelRegion: string\n ratingLabel: (rating: string) => string\n severityLabel: (sev: string) => string\n worstLabel: (sev: string) => string\n // signal-kind display label (identifier stays in data attrs / logic)\n kindLabel: (kind: SignalKind) => string\n // render reasons\n reasonMounted: string\n reasonState: string\n reasonProps: string\n reasonParent: string\n cascadeRoot: string\n changedProps: string\n unnecessaryRenders: (n: number) => string\n // long-task scripts\n scripts: string\n invoker: string\n source: string\n blockingTime: string\n noScripts: string\n hotFunctions: string\n hotFunctionsHint: string\n // interaction (INP)\n interactionEvent: string\n inputDelay: string\n processingTime: string\n presentation: string\n interactionThresholdHint: string\n // layout-shift\n layoutShiftHint: string\n // browser capability\n unsupportedInBrowser: (kinds: string) => string\n}\n\nconst en: Strings = {\n save: 'Save',\n saveAria: 'Save recording',\n saveTitle: 'Save recording as JSON',\n closeAria: 'Close panel',\n noSignals: 'No signals recorded.',\n sort: 'Sort',\n sortChronological: 'chronological',\n sortSeverity: 'severity (worst first)',\n filterPlaceholder: 'Filter…',\n filterAria: 'Filter signals',\n filterNoMatches: 'No signals match the filter.',\n groupBy: 'Group by',\n groupChronological: 'chronological',\n groupComponent: 'component',\n groupSource: 'source',\n groupCommit: 'cascade (commit)',\n timeline: 'timeline',\n value: 'value',\n started: 'started',\n duration: 'duration',\n size: 'size',\n bytes: 'bytes',\n renderBlocking: 'render-blocking',\n metric: 'metric',\n component: 'component',\n reason: 'reason',\n at: 'at',\n ended: 'ended',\n yes: 'yes',\n no: 'no',\n rect: 'rect',\n noSourceRects: 'No source rects.',\n noStack: 'No stack captured.',\n resolvingSourceMaps: 'resolving source maps…',\n anonymous: '(anonymous)',\n blocking: 'blocking',\n sourceCount: (n) => `${n} source(s)`,\n moreItems: (n) => `+ ${n} more`,\n coalescedReads: (n) => `${n} reads`,\n cascadeComponents: (n) => `${n} components`,\n startRecording: 'Start recording',\n stopRecording: 'Stop recording',\n rec: 'rec',\n signalsTitle: (n, kind) => `${n} ${kind} signals`,\n noTimeBound: 'No time-bound signals to plot.',\n timeAxis: 'time',\n heapLabel: 'heap',\n heapUnsupported: 'heap size unavailable (Chromium only)',\n heapExtensionHint:\n 'Heap size includes browser extensions injected into the page (e.g. React DevTools), so it can rise even while your app is idle. For app-only measurement, record in an incognito window or a profile with extensions disabled.',\n heapTrendLabel: (cls) =>\n cls === 'leak-suspected' ? 'leak suspected' : cls === 'growing' ? 'growing' : 'stable',\n leaksTitle: 'Suspected leaks',\n leakHint:\n 'Components whose unmounted instances stayed in memory with a count that kept climbing. Shows which component leaks and how many instances — not what retains them (a heap snapshot, unavailable in-page, is needed for that).',\n leakSuspect: (component, retained, unmounted) =>\n `${component} — ${retained} retained of ${unmounted} unmounted, climbing`,\n fpsLabel: 'fps',\n fpsUnsupported: 'frame timing unavailable',\n fpsBadge: (minFps, dropped) => `min ${minFps}fps · ${dropped} dropped`,\n fpsWorst: (ms) => `worst ${ms}ms`,\n topRenderers: 'Top renderers · by total time',\n moreComponents: (n) => `+ ${n} more component${n === 1 ? '' : 's'}`,\n rendererDetail: (c, n, total, max) =>\n `${c} · ${n} renders · total ${total.toFixed(1)}ms · max ${max.toFixed(1)}ms`,\n language: 'Language',\n panelRegion: 'react-perfscope panel',\n ratingLabel: (rating) => `rating: ${rating}`,\n severityLabel: (sev) => `severity: ${sev}`,\n worstLabel: (sev) => `worst: ${sev}`,\n kindLabel: (kind) => kind,\n reasonMounted: 'mounted',\n reasonState: 'state changed',\n reasonProps: 'props changed',\n reasonParent: 'parent re-rendered',\n cascadeRoot: 'root',\n changedProps: 'changed',\n unnecessaryRenders: (n) => `${n} unnecessary render${n === 1 ? '' : 's'} (parent-driven)`,\n scripts: 'scripts',\n invoker: 'invoker',\n source: 'source',\n blockingTime: 'blocking',\n noScripts: 'No script attribution (LoAF unsupported).',\n hotFunctions: 'your hot functions',\n hotFunctionsHint: 'sampled time spent in your own source',\n interactionEvent: 'event',\n inputDelay: 'input delay',\n processingTime: 'processing',\n presentation: 'presentation',\n interactionThresholdHint: 'Only interactions ≥40ms are shown — INP surfaces the slow ones; fast clicks are omitted.',\n layoutShiftHint: 'Every layout shift, including ones triggered by your interactions. The CLS metric excludes input-driven shifts, so this is not a CLS score.',\n unsupportedInBrowser: (kinds) => `Not measurable in this browser (the API is missing, not that nothing happened): ${kinds}.`,\n}\n\nconst KIND_LABELS_KO: Record<SignalKind, string> = {\n render: '렌더',\n 'layout-shift': '레이아웃 이동',\n 'long-task': '긴 작업',\n 'forced-reflow': '강제 리플로우',\n network: '네트워크',\n interaction: '상호작용',\n 'web-vital': '웹 바이탈',\n}\n\nconst ko: Strings = {\n save: '저장',\n saveAria: '녹화 저장',\n saveTitle: '녹화를 JSON으로 저장',\n closeAria: '패널 닫기',\n noSignals: '녹화된 시그널이 없어요.',\n sort: '정렬',\n sortChronological: '시간순',\n sortSeverity: '심각도순 (높은 것부터)',\n filterPlaceholder: '필터…',\n filterAria: '시그널 필터',\n filterNoMatches: '필터와 일치하는 시그널이 없어요.',\n groupBy: '그룹화',\n groupChronological: '시간순',\n groupComponent: '컴포넌트',\n groupSource: '소스',\n groupCommit: '연쇄 (커밋)',\n timeline: '타임라인',\n value: '값',\n started: '시작',\n duration: '지속시간',\n size: '크기',\n bytes: '바이트',\n renderBlocking: '렌더 차단',\n metric: '지표',\n component: '컴포넌트',\n reason: '원인',\n at: '시점',\n ended: '종료',\n yes: '예',\n no: '아니오',\n rect: '영역',\n noSourceRects: '소스 영역이 없어요.',\n noStack: '캡처된 스택이 없어요.',\n resolvingSourceMaps: '소스맵 해석 중…',\n anonymous: '(익명)',\n blocking: '차단',\n sourceCount: (n) => `소스 ${n}개`,\n moreItems: (n) => `외 ${n}개 더`,\n coalescedReads: (n) => `읽기 ${n}회`,\n cascadeComponents: (n) => `컴포넌트 ${n}개`,\n startRecording: '녹화 시작',\n stopRecording: '녹화 종료',\n rec: '녹화',\n signalsTitle: (n, kind) => `${kind} 시그널 ${n}개`,\n noTimeBound: '표시할 시간 기반 시그널이 없어요.',\n timeAxis: '시간',\n heapLabel: '힙',\n heapUnsupported: '힙 측정 미지원 (크롬 전용)',\n heapExtensionHint:\n '힙 크기엔 페이지에 주입된 브라우저 확장(예: React DevTools) 메모리도 포함돼요. 그래서 앱이 idle이어도 올라갈 수 있어요. 앱만 정확히 재려면 시크릿 창이나 확장이 꺼진 프로필에서 녹화하세요.',\n heapTrendLabel: (cls) =>\n cls === 'leak-suspected' ? '누수 의심' : cls === 'growing' ? '증가 중' : '안정',\n leaksTitle: '누수 의심',\n leakHint:\n '언마운트됐는데 메모리에 남고 그 수가 계속 늘어난 컴포넌트예요. 어떤 컴포넌트가 몇 개 누수하는지는 보여주지만, 무엇이 붙잡고 있는지는(힙 스냅샷이 필요한데 in-page에선 불가) 알 수 없어요.',\n leakSuspect: (component, retained, unmounted) =>\n `${component} — 언마운트 ${unmounted}개 중 ${retained}개 보유, 증가 중`,\n fpsLabel: 'fps',\n fpsUnsupported: '프레임 측정 미지원',\n fpsBadge: (minFps, dropped) => `최저 ${minFps}fps · 드랍 ${dropped}`,\n fpsWorst: (ms) => `최악 ${ms}ms`,\n topRenderers: '상위 렌더러 · 총 시간순',\n moreComponents: (n) => `외 컴포넌트 ${n}개 더`,\n rendererDetail: (c, n, total, max) =>\n `${c} · 렌더 ${n}회 · 총 ${total.toFixed(1)}ms · 최대 ${max.toFixed(1)}ms`,\n language: '언어',\n panelRegion: 'react-perfscope 패널',\n ratingLabel: (rating) => `평가: ${rating}`,\n severityLabel: (sev) => `심각도: ${sev}`,\n worstLabel: (sev) => `가장 심각: ${sev}`,\n kindLabel: (kind) => KIND_LABELS_KO[kind],\n reasonMounted: '마운트됨',\n reasonState: 'state 변경',\n reasonProps: 'props 변경',\n reasonParent: '부모 따라 리렌더',\n cascadeRoot: '시작점',\n changedProps: '변경된 props',\n unnecessaryRenders: (n) => `불필요한 리렌더 ${n}개 (부모 때문에)`,\n scripts: '스크립트',\n invoker: '호출자',\n source: '소스',\n blockingTime: '차단 시간',\n noScripts: '스크립트 출처 없음 (LoAF 미지원).',\n hotFunctions: '내 코드 핫스팟',\n hotFunctionsHint: '내 소스에서 샘플링된 점유 시간',\n interactionEvent: '이벤트',\n inputDelay: '입력 지연',\n processingTime: '처리',\n presentation: '화면 반영',\n interactionThresholdHint: '40ms 이상 걸린 상호작용만 표시돼요 — 느린 것만 INP로 잡고, 빠른 클릭은 생략해요.',\n layoutShiftHint: '사용자 인터랙션으로 생긴 것까지 포함한 모든 레이아웃 시프트예요. CLS 지표는 입력으로 인한 시프트를 제외하므로, 이건 CLS 점수가 아니에요.',\n unsupportedInBrowser: (kinds) => `이 브라우저에선 측정할 수 없어요 (아무 일도 없던 게 아니라 API가 없음): ${kinds}.`,\n}\n\nexport const STRINGS: Record<Lang, Strings> = { en, ko }\n\nfunction isLang(v: unknown): v is Lang {\n return v === 'en' || v === 'ko'\n}\n\nexport function readStoredLang(): Lang {\n if (typeof localStorage === 'undefined') return 'en'\n try {\n const v = localStorage.getItem(STORAGE_KEY)\n return isLang(v) ? v : 'en'\n } catch {\n return 'en'\n }\n}\n\nexport interface I18nValue {\n lang: Lang\n setLang: (lang: Lang) => void\n t: Strings\n}\n\n// Default value: English with a no-op setter. Lets components render outside a\n// provider (e.g. unit tests) and default to English without crashing.\nconst I18nContext = createContext<I18nValue>({\n lang: 'en',\n setLang: () => {},\n t: en,\n})\n\nexport function I18nProvider({ children }: { children: ComponentChildren }) {\n const [lang, setLangState] = useState<Lang>(() => readStoredLang())\n const setLang = useCallback((l: Lang) => {\n setLangState(l)\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(STORAGE_KEY, l)\n } catch {\n // ignore persistence failures (private mode, quota, etc.)\n }\n }\n }, [])\n const value = useMemo<I18nValue>(() => ({ lang, setLang, t: STRINGS[lang] }), [lang, setLang])\n return h(I18nContext.Provider, { value }, children)\n}\n\nexport function useI18n(): I18nValue {\n return useContext(I18nContext)\n}\n","import { h } from 'preact'\nimport type { WidgetPosition } from './types'\nimport { useI18n } from './i18n'\n\nexport interface WidgetProps {\n recording: boolean\n elapsedMs?: number\n onToggle: () => void\n position?: WidgetPosition\n}\n\nconst POSITION_STYLES: Record<WidgetPosition, Record<string, string>> = {\n 'bottom-right': { bottom: '16px', right: '16px' },\n 'bottom-left': { bottom: '16px', left: '16px' },\n 'top-right': { top: '16px', right: '16px' },\n 'top-left': { top: '16px', left: '16px' },\n}\n\nfunction formatElapsed(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000)\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds - minutes * 60\n return `${minutes}:${seconds.toString().padStart(2, '0')}`\n}\n\nexport function Widget(props: WidgetProps) {\n const { recording, elapsedMs = 0, onToggle, position = 'bottom-right' } = props\n const positionStyle = POSITION_STYLES[position]\n const { t } = useI18n()\n\n return (\n <div\n data-position={position}\n style={{\n position: 'fixed',\n ...positionStyle,\n zIndex: '2147483647',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }}\n >\n <button\n type=\"button\"\n aria-pressed={recording}\n aria-label={recording ? t.stopRecording : t.startRecording}\n onClick={onToggle}\n style={{\n background: '#1a1a1a',\n color: '#e6e6e6',\n border: '1px solid #2a2a2a',\n borderRadius: '20px',\n padding: '8px 14px',\n fontSize: '12px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.2)',\n }}\n >\n <span\n style={{\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: recording ? '#ff3b30' : '#666',\n display: 'inline-block',\n }}\n />\n <span aria-live=\"polite\">\n {recording ? formatElapsed(elapsedMs) : t.rec}\n </span>\n </button>\n </div>\n )\n}\n","import { h } from 'preact'\nimport { useState, useMemo, useEffect, useRef } from 'preact/hooks'\nimport type {\n RecordingResult,\n Signal,\n SignalKind,\n ForcedReflowSignal,\n LayoutShiftSignal,\n LongTaskSignal,\n LongTaskAttribution,\n NetworkSignal,\n RenderSignal,\n InteractionSignal,\n RenderReason,\n WebVitalSignal,\n StackFrame,\n} from '@react-perfscope/core'\nimport { unsupportedKinds } from '@react-perfscope/core'\nimport type { WidgetPosition } from './types'\nimport { showOverlay, hideOverlay, hideAllOverlays, showArrow, hideArrow } from './overlay'\nimport {\n severityForSignal,\n worstSeverity,\n webVitalRating,\n SEVERITY_COLOR,\n SEVERITY_OVERLAY_COLOR,\n RATING_COLOR,\n severityRank,\n type Severity,\n type Rating,\n} from './severity'\nimport { SummaryHeader } from './summary'\nimport { Timeline } from './timeline'\nimport { LeakList } from './leaks'\nimport { RenderInsights } from './render-insights'\nimport { InpEpisode } from './inp-episode'\nimport { LongTaskEpisode } from './long-task-episode'\nimport { signalMatchesFilter } from './filter'\nimport { useI18n, type Lang, type Strings } from './i18n'\n\n// Render-reason colors. `parent` is amber because it's the avoidable case —\n// the component re-rendered only because its parent did, with no prop change.\n// `state` is green: it's the intentional root of the cascade. `mount`/`props`\n// are neutral/informational.\nconst RENDER_REASON_COLOR: Record<RenderReason, string> = {\n mount: '#5ac8fa',\n state: '#34c759',\n props: '#8e8e93',\n parent: '#ff9500',\n}\n\nfunction renderReasonLabel(t: Strings, reason: RenderReason): string {\n switch (reason) {\n case 'mount': return t.reasonMounted\n case 'state': return t.reasonState\n case 'props': return t.reasonProps\n case 'parent': return t.reasonParent\n }\n}\n\nfunction RenderReasonTag({ reason, changedProps }: { reason: RenderReason; changedProps?: string[] }) {\n const { t } = useI18n()\n const color = RENDER_REASON_COLOR[reason]\n const label = renderReasonLabel(t, reason)\n const keys = reason === 'props' && changedProps && changedProps.length > 0 ? `: ${changedProps.join(', ')}` : ''\n return (\n <span\n style={{\n color,\n border: `1px solid ${color}`,\n borderRadius: '4px',\n padding: '0 5px',\n fontSize: '10px',\n fontWeight: 600,\n whiteSpace: 'nowrap',\n }}\n >\n {label}{keys}\n </span>\n )\n}\n\nexport interface PanelProps {\n result: RecordingResult\n position?: WidgetPosition\n onClose: () => void\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}\n\nconst KIND_ORDER: SignalKind[] = [\n 'forced-reflow',\n 'layout-shift',\n 'long-task',\n 'interaction',\n 'network',\n 'web-vital',\n 'render',\n]\n\nconst POSITION_STYLES: Record<WidgetPosition, Record<string, string>> = {\n 'bottom-right': { bottom: '16px', right: '16px' },\n 'bottom-left': { bottom: '16px', left: '16px' },\n 'top-right': { top: '16px', right: '16px' },\n 'top-left': { top: '16px', left: '16px' },\n}\n\nfunction groupByKind(signals: Signal[]): Record<SignalKind, Signal[]> {\n const acc = {\n 'forced-reflow': [] as Signal[],\n 'layout-shift': [] as Signal[],\n 'long-task': [] as Signal[],\n 'interaction': [] as Signal[],\n 'network': [] as Signal[],\n 'web-vital': [] as Signal[],\n 'render': [] as Signal[],\n } as Record<SignalKind, Signal[]>\n for (const s of signals) acc[s.kind].push(s)\n return acc\n}\n\nconst WEB_VITAL_UNIT: Record<WebVitalSignal['name'], string> = {\n LCP: 'ms',\n INP: 'ms',\n CLS: '',\n FCP: 'ms',\n TTFB: 'ms',\n}\n\nfunction RatingDot({ rating }: { rating: Rating }) {\n const { t } = useI18n()\n return (\n <span\n data-rating={rating}\n aria-label={t.ratingLabel(rating)}\n style={{\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: RATING_COLOR[rating],\n marginRight: '6px',\n verticalAlign: 'middle',\n }}\n />\n )\n}\n\nfunction hexToRgba(hex: string, alpha: number): string {\n // Accepts #rrggbb only. Returns rgba(...) with the requested alpha.\n const m = /^#([0-9a-f]{6})$/i.exec(hex)\n if (!m) return hex\n const v = m[1]!\n const r = parseInt(v.slice(0, 2), 16)\n const g = parseInt(v.slice(2, 4), 16)\n const b = parseInt(v.slice(4, 6), 16)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\nfunction formatCls(value: number): string {\n if (value === 0) return '0'\n if (value < 0.001) return value.toExponential(2)\n if (value < 0.01) return value.toFixed(4)\n return value.toFixed(3)\n}\n\nfunction summary(s: Signal): string {\n switch (s.kind) {\n case 'forced-reflow':\n return `@ ${s.at.toFixed(1)}ms • duration ${s.duration.toFixed(2)}ms`\n case 'layout-shift':\n return `@ ${s.at.toFixed(1)}ms • value ${formatCls(s.value)} • ${s.sources.length} source(s)`\n case 'long-task':\n return `@ ${s.at.toFixed(1)}ms • duration ${s.duration.toFixed(1)}ms`\n case 'interaction':\n return `${s.eventType}${s.target ? ` ${s.target}` : ''} • ${s.duration.toFixed(0)}ms`\n case 'network':\n return `${s.url.length > 60 ? s.url.slice(0, 57) + '...' : s.url} • ${s.duration.toFixed(0)}ms${s.blocking ? ' • blocking' : ''}`\n case 'web-vital':\n return `${s.name}: ${s.value.toFixed(2)}`\n case 'render':\n return `${s.component} • ${s.reason} • ${s.duration.toFixed(2)}ms${s.count && s.count > 1 ? ` • ${s.count} components` : ''}`\n }\n}\n\nconst detailLabelStyle = { color: '#888', marginRight: '6px' } as const\nconst detailRowStyle = { padding: '2px 0', display: 'flex', gap: '6px' } as const\nconst monoStyle = {\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n} as const\n\nfunction LayoutShiftDetail({ s }: { s: LayoutShiftSignal }) {\n const { t } = useI18n()\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.value}</span><span>{s.value.toFixed(4)}</span></div>\n {s.sources.length === 0 ? (\n <div style={{ color: '#666' }}>{t.noSourceRects}</div>\n ) : (\n s.sources.map((r, i) => (\n <div key={i} style={{ ...detailRowStyle, ...monoStyle }}>\n <span style={{ color: '#888' }}>{t.rect} {i + 1}</span>\n <span>x={r.x.toFixed(0)} y={r.y.toFixed(0)} w={r.width.toFixed(0)} h={r.height.toFixed(0)}</span>\n </div>\n ))\n )}\n </div>\n )\n}\n\nfunction NetworkDetail({ s }: { s: NetworkSignal }) {\n const { t } = useI18n()\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={{ ...detailRowStyle, ...monoStyle, wordBreak: 'break-all' as const }}>\n <span>{s.url}</span>\n </div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.started}</span><span>{s.startedAt.toFixed(0)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(0)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.size}</span><span>{(s.size / 1024).toFixed(2)}KB ({s.size} {t.bytes})</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.renderBlocking}</span><span>{s.blocking ? t.yes : t.no}</span></div>\n </div>\n )\n}\n\nfunction WebVitalDetail({ s }: { s: WebVitalSignal }) {\n const { t } = useI18n()\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.metric}</span><span>{s.name}</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.value}</span><span>{s.value.toFixed(2)}</span></div>\n </div>\n )\n}\n\nfunction RenderDetail({ s }: { s: RenderSignal }) {\n const { t } = useI18n()\n // Commit signal (carries members): show the whole cascade.\n if (s.members && s.members.length > 0) {\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(3)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.at}</span><span>{s.at.toFixed(2)}ms</span></div>\n <div style={{ marginTop: '6px' }}><CascadeMembers members={s.members} /></div>\n </div>\n )\n }\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.component}</span><span>{s.component}</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.reason}</span><RenderReasonTag reason={s.reason} changedProps={s.changedProps} /></div>\n {s.reason === 'props' && s.changedProps && s.changedProps.length > 0 && (\n <div style={{ ...detailRowStyle, ...monoStyle }}><span style={detailLabelStyle}>{t.changedProps}</span><span>{s.changedProps.join(', ')}</span></div>\n )}\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(3)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.at}</span><span>{s.at.toFixed(2)}ms</span></div>\n </div>\n )\n}\n\nfunction StackFrames({\n raw,\n resolveFrame,\n limit = 8,\n}: {\n raw: StackFrame[]\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n limit?: number\n}) {\n const { t } = useI18n()\n const original = raw.slice(0, limit)\n const [frames, setFrames] = useState<StackFrame[]>(original)\n const [resolving, setResolving] = useState(false)\n\n useEffect(() => {\n if (!resolveFrame || original.length === 0) return\n let cancelled = false\n setResolving(true)\n Promise.all(original.map((f) => resolveFrame(f)))\n .then((resolved) => {\n if (!cancelled) setFrames(resolved)\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setResolving(false)\n })\n return () => {\n cancelled = true\n }\n }, [raw])\n\n return (\n <>\n {resolving && (\n <div style={{ color: '#666', fontSize: '10px', marginBottom: '4px' }}>\n {t.resolvingSourceMaps}\n </div>\n )}\n {frames.length === 0 ? (\n <div style={{ color: '#666' }}>{t.noStack}</div>\n ) : (\n frames.map((f, i) => (\n <div key={i} style={{ ...detailRowStyle, ...monoStyle }}>\n {f.fnName ? <span>{f.fnName}</span> : <span style={{ color: '#666' }}>{t.anonymous}</span>}\n <span style={{ color: '#888' }}>{f.file}:{f.line}:{f.col}</span>\n </div>\n ))\n )}\n </>\n )\n}\n\nfunction ForcedReflowDetail({\n s,\n resolveFrame,\n}: {\n s: ForcedReflowSignal\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n return (\n <div style={{ paddingLeft: '12px' }}>\n <StackFrames raw={s.stack} resolveFrame={resolveFrame} />\n </div>\n )\n}\n\nfunction HotFunctions({\n attribution,\n resolveFrame,\n}: {\n attribution: LongTaskAttribution[]\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n const { t } = useI18n()\n const [frames, setFrames] = useState<StackFrame[]>(attribution.map((a) => a.frame))\n\n useEffect(() => {\n if (!resolveFrame) return\n let cancelled = false\n Promise.all(attribution.map((a) => resolveFrame(a.frame)))\n .then((resolved) => {\n if (!cancelled) setFrames(resolved)\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [attribution])\n\n return (\n <div style={{ marginTop: '6px' }}>\n <div style={{ ...detailLabelStyle, textTransform: 'uppercase', fontSize: '10px', letterSpacing: '0.5px', marginBottom: '1px', color: '#ff9f0a' }}>{t.hotFunctions}</div>\n <div style={{ color: '#666', fontSize: '10px', marginBottom: '4px' }}>{t.hotFunctionsHint}</div>\n {attribution.map((a, i) => {\n const f = frames[i] ?? a.frame\n const pct = Math.round(a.selfRatio * 100)\n return (\n <div key={i} style={{ ...monoStyle, padding: '3px 0', borderTop: i > 0 ? '1px dashed #1f1f1f' : 'none' }}>\n <div>\n <span style={{ color: '#ff9f0a', fontWeight: 600 }}>{f.fnName || <span style={{ color: '#666' }}>{t.anonymous}</span>}</span>\n <span style={{ color: SEVERITY_COLOR.medium, marginLeft: '6px' }}>{pct}%</span>\n <span style={{ color: '#666', marginLeft: '6px' }}>({a.sampleCount})</span>\n </div>\n <div style={{ color: '#888', wordBreak: 'break-all' as const }}>{f.file}:{f.line}:{f.col}</div>\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction LongTaskDetail({\n s,\n resolveFrame,\n}: {\n s: LongTaskSignal\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n const { t } = useI18n()\n const scripts = s.scripts ? [...s.scripts].sort((a, b) => b.duration - a.duration) : []\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.started}</span><span>{s.at.toFixed(2)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.ended}</span><span>{(s.at + s.duration).toFixed(2)}ms</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(2)}ms</span></div>\n {typeof s.blockingDuration === 'number' && (\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.blockingTime}</span><span>{s.blockingDuration.toFixed(2)}ms</span></div>\n )}\n {s.attribution !== undefined && s.attribution.length > 0 && (\n <HotFunctions attribution={s.attribution} resolveFrame={resolveFrame} />\n )}\n {s.scripts !== undefined && (\n <div style={{ marginTop: '6px' }}>\n <div style={{ ...detailLabelStyle, textTransform: 'uppercase', fontSize: '10px', letterSpacing: '0.5px', marginBottom: '4px' }}>{t.scripts}</div>\n {scripts.length === 0 ? (\n <div style={{ color: '#666' }}>{t.noScripts}</div>\n ) : (\n scripts.map((script, i) => (\n <div key={i} style={{ ...monoStyle, padding: '3px 0', borderTop: i > 0 ? '1px dashed #1f1f1f' : 'none' }}>\n <div>\n <span>{script.sourceFunctionName || <span style={{ color: '#666' }}>{t.anonymous}</span>}</span>\n <span style={{ color: '#5ac8fa', marginLeft: '6px' }}>{script.invokerType}</span>\n <span style={{ color: SEVERITY_COLOR.medium, marginLeft: '6px' }}>{script.duration.toFixed(1)}ms</span>\n </div>\n {script.sourceURL && (\n <div style={{ color: '#888', wordBreak: 'break-all' as const }}>\n {script.sourceURL}{script.charPosition >= 0 ? `@${script.charPosition}` : ''}\n </div>\n )}\n {script.invoker && <div style={{ color: '#666' }}>{t.invoker}: {script.invoker}</div>}\n </div>\n ))\n )}\n </div>\n )}\n {s.scripts === undefined && s.stack.length > 0 && (\n <div style={{ marginTop: '4px' }}>\n <StackFrames raw={s.stack} resolveFrame={resolveFrame} limit={5} />\n </div>\n )}\n </div>\n )\n}\n\nconst INTERACTION_PHASE_COLOR = { input: '#8e8e93', processing: '#5ac8fa', presentation: '#34c759' }\n\nfunction InteractionDetail({\n s,\n resolveFrame,\n}: {\n s: InteractionSignal\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n const { t } = useI18n()\n const total = Math.max(s.duration, 1)\n const phases: { label: string; ms: number; color: string }[] = [\n { label: t.inputDelay, ms: s.inputDelay, color: INTERACTION_PHASE_COLOR.input },\n { label: t.processingTime, ms: s.processing, color: INTERACTION_PHASE_COLOR.processing },\n { label: t.presentation, ms: s.presentation, color: INTERACTION_PHASE_COLOR.presentation },\n ]\n return (\n <div style={{ paddingLeft: '12px' }}>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.interactionEvent}</span><span>{s.eventType}{s.target ? ` · ${s.target}` : ''}</span></div>\n <div style={detailRowStyle}><span style={detailLabelStyle}>{t.duration}</span><span>{s.duration.toFixed(0)}ms</span></div>\n <div style={{ display: 'flex', height: '10px', borderRadius: '3px', overflow: 'hidden', margin: '5px 0 7px', background: '#1a1a1a' }}>\n {phases.map((p, i) => (\n <div key={i} style={{ width: `${(p.ms / total) * 100}%`, background: p.color }} />\n ))}\n </div>\n {phases.map((p, i) => (\n <div key={i} style={detailRowStyle}>\n <span style={{ ...detailLabelStyle, display: 'inline-flex', alignItems: 'center', gap: '5px' }}>\n <span style={{ width: '7px', height: '7px', borderRadius: '2px', background: p.color, flex: '0 0 7px' }} />\n {p.label}\n </span>\n <span>{p.ms.toFixed(0)}ms</span>\n </div>\n ))}\n {s.attribution !== undefined && s.attribution.length > 0 && (\n <HotFunctions attribution={s.attribution} resolveFrame={resolveFrame} />\n )}\n </div>\n )\n}\n\nfunction SignalDetail({\n s,\n resolveFrame,\n}: {\n s: Signal\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}) {\n switch (s.kind) {\n case 'forced-reflow': return <ForcedReflowDetail s={s} resolveFrame={resolveFrame} />\n case 'layout-shift': return <LayoutShiftDetail s={s} />\n case 'long-task': return <LongTaskDetail s={s} resolveFrame={resolveFrame} />\n case 'interaction': return <InteractionDetail s={s} resolveFrame={resolveFrame} />\n case 'network': return <NetworkDetail s={s} />\n case 'web-vital': return <WebVitalDetail s={s} />\n case 'render': return <RenderDetail s={s} />\n }\n}\n\nfunction SeverityDot({ sev, title }: { sev: Severity; title?: string }) {\n const { t } = useI18n()\n return (\n <span\n data-severity={sev}\n aria-label={t.severityLabel(sev)}\n title={title ?? sev}\n style={{\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n background: SEVERITY_COLOR[sev],\n flex: '0 0 8px',\n boxShadow: sev === 'high' ? '0 0 6px rgba(255,59,48,0.6)' : 'none',\n }}\n />\n )\n}\n\nfunction SummaryLine({ signal }: { signal: Signal }) {\n const { t } = useI18n()\n if (signal.kind === 'web-vital') {\n const rating = webVitalRating(signal.name, signal.value)\n const unit = WEB_VITAL_UNIT[signal.name]\n return (\n <span>\n <RatingDot rating={rating} />\n <strong>{signal.name}</strong>: {signal.value.toFixed(2)}{unit}\n </span>\n )\n }\n const sev = severityForSignal(signal)\n const color = SEVERITY_COLOR[sev]\n if (signal.kind === 'long-task') {\n return (\n <span>\n @ {signal.at.toFixed(1)}ms • duration{' '}\n <span style={{ color }}>{signal.duration.toFixed(1)}ms</span>\n </span>\n )\n }\n if (signal.kind === 'forced-reflow') {\n const count = signal.count ?? 1\n return (\n <span>\n @ {signal.at.toFixed(1)}ms • duration{' '}\n <span style={{ color }}>{signal.duration.toFixed(2)}ms</span>\n {count > 1 && (\n <span style={{ color: '#888' }}> • {t.coalescedReads(count)}</span>\n )}\n </span>\n )\n }\n if (signal.kind === 'layout-shift') {\n return (\n <span>\n @ {signal.at.toFixed(1)}ms • value{' '}\n <span style={{ color }}>{formatCls(signal.value)}</span>\n {' • '}{t.sourceCount(signal.sources.length)}\n </span>\n )\n }\n if (signal.kind === 'render') {\n return (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: '6px' }}>\n <strong>{signal.component}</strong>\n <RenderReasonTag reason={signal.reason} changedProps={signal.changedProps} />\n <span style={{ color }}>{signal.duration.toFixed(2)}ms</span>\n {signal.count && signal.count > 1 && (\n <span style={{ color: '#888' }}>{t.cascadeComponents(signal.count)}</span>\n )}\n </span>\n )\n }\n if (signal.kind === 'network') {\n const url = signal.url.length > 60 ? signal.url.slice(0, 57) + '...' : signal.url\n return (\n <span>\n {url} • <span style={{ color }}>{signal.duration.toFixed(0)}ms</span>\n {signal.blocking && <span style={{ color: SEVERITY_COLOR.high }}> • {t.blocking}</span>}\n </span>\n )\n }\n return <span>{summary(signal)}</span>\n}\n\ntype GroupMode = 'chronological' | 'component' | 'source' | 'commit'\ntype SortMode = 'chronological' | 'severity'\n\nfunction tabSupportsGrouping(kind: SignalKind): boolean {\n return kind === 'render' || kind === 'forced-reflow'\n}\n\nfunction sortSignalsBySeverity(signals: Signal[]): Signal[] {\n return [...signals].sort((a, b) => {\n const ra = severityRank(severityForSignal(a))\n const rb = severityRank(severityForSignal(b))\n if (rb !== ra) return rb - ra\n return a.kind === 'web-vital' || b.kind === 'web-vital' ? 0 : (('at' in a ? a.at : 0) - ('at' in b ? b.at : 0))\n })\n}\n\ninterface SignalGroup {\n label: string\n count: number\n signals: Signal[]\n}\n\nfunction downloadRecording(result: RecordingResult): void {\n // Materialise lazy `stack` getters on forced-reflow and long-task signals\n // so JSON.stringify includes the parsed frames.\n const exportable = {\n ...result,\n signals: result.signals.map((s) => {\n if (s.kind === 'forced-reflow' || s.kind === 'long-task') {\n return { ...s, stack: s.stack }\n }\n return s\n }),\n }\n const json = JSON.stringify(exportable, null, 2)\n const blob = new Blob([json], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n try {\n const a = document.createElement('a')\n a.href = url\n a.download = `react-perfscope-${new Date().toISOString().replace(/[:.]/g, '-')}.json`\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n } finally {\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n }\n}\n\nfunction groupSignals(signals: Signal[], mode: GroupMode, kind: SignalKind): SignalGroup[] {\n if (mode === 'chronological') {\n return signals.map((s, i) => ({ label: `#${i + 1}`, count: 1, signals: [s] }))\n }\n if (mode === 'component' && kind === 'render') {\n const byName = new Map<string, Signal[]>()\n // Render signals are coalesced per commit; expand members back to\n // per-component rows for this view.\n for (const s of signals) {\n if (s.kind !== 'render') continue\n for (const m of s.members ?? [s]) {\n if (!byName.has(m.component)) byName.set(m.component, [])\n byName.get(m.component)!.push(m)\n }\n }\n return Array.from(byName.entries())\n .sort((a, b) => b[1].length - a[1].length)\n .map(([label, list]) => ({ label, count: list.length, signals: list }))\n }\n if (mode === 'commit' && kind === 'render') {\n // Each render signal already represents one commit.\n return signals\n .filter((s): s is RenderSignal => s.kind === 'render')\n .sort((a, b) => a.commitId - b.commitId)\n .map((s) => {\n const list = s.members ?? [s]\n return { label: s.component, count: list.length, signals: list }\n })\n }\n if (mode === 'source' && kind === 'forced-reflow') {\n const bySource = new Map<string, Signal[]>()\n for (const s of signals) {\n if (s.kind !== 'forced-reflow') continue\n const top = s.stack[0]\n const k = top ? `${top.file}:${top.line}:${top.col}` : '(no stack)'\n if (!bySource.has(k)) bySource.set(k, [])\n bySource.get(k)!.push(s)\n }\n return Array.from(bySource.entries())\n .sort((a, b) => b[1].length - a[1].length)\n .map(([label, list]) => ({ label, count: list.length, signals: list }))\n }\n return signals.map((s, i) => ({ label: `#${i + 1}`, count: 1, signals: [s] }))\n}\n\ninterface SignalRowProps {\n signal: Signal\n expanded: boolean\n onToggleExpand: () => void\n onHoverGeometry: (signal: LayoutShiftSignal | null) => void\n resolveFrame?: (frame: StackFrame) => Promise<StackFrame>\n}\n\nfunction SignalRow({ signal, expanded, onToggleExpand, onHoverGeometry, resolveFrame }: SignalRowProps) {\n const hasGeometry = signal.kind === 'layout-shift' && signal.sources.length > 0\n const sev = severityForSignal(signal)\n return (\n <li\n aria-expanded={expanded}\n data-severity={sev}\n onClick={onToggleExpand}\n onMouseEnter={() => {\n if (hasGeometry && signal.kind === 'layout-shift') onHoverGeometry(signal)\n }}\n onMouseLeave={() => {\n if (hasGeometry) onHoverGeometry(null)\n }}\n style={{\n padding: '6px 8px',\n borderTop: '1px solid #1a1a1a',\n borderLeft: `3px solid ${sev === 'low' ? 'transparent' : SEVERITY_COLOR[sev]}`,\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n cursor: 'pointer',\n userSelect: 'none' as const,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <span style={{ color: '#888', width: '10px' }}>{expanded ? '▼' : '▶'}</span>\n <SeverityDot sev={sev} />\n <SummaryLine signal={signal} />\n </div>\n {expanded && (\n <div style={{ marginTop: '6px', paddingTop: '6px', borderTop: '1px dashed #2a2a2a' }}>\n <SignalDetail s={signal} resolveFrame={resolveFrame} />\n </div>\n )}\n </li>\n )\n}\n\nfunction CascadeMembers({ members }: { members: RenderSignal[] }) {\n const minDepth = members.reduce((m, s) => Math.min(m, s.depth), Infinity)\n return (\n <div>\n {members.map((m, i) => {\n const indent = (m.depth - minDepth) * 14\n const isCascade = m.reason === 'parent'\n return (\n <div\n key={i}\n style={{\n marginLeft: `${indent}px`,\n padding: '2px 0',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n <span style={{ color: isCascade ? RENDER_REASON_COLOR.parent : '#555' }}>\n {m.depth > minDepth ? '└' : '•'}\n </span>\n <strong>{m.component}</strong>\n <RenderReasonTag reason={m.reason} changedProps={m.changedProps} />\n <span style={{ color: '#888' }}>{m.duration.toFixed(2)}ms</span>\n </div>\n )\n })}\n </div>\n )\n}\n\ntype ActiveTab = SignalKind | 'timeline'\n\nfunction LanguageToggle() {\n const { lang, setLang, t } = useI18n()\n const langs: Lang[] = ['en', 'ko']\n const labels: Record<Lang, string> = { en: 'EN', ko: '한' }\n return (\n <div\n role=\"group\"\n aria-label={t.language}\n style={{\n display: 'inline-flex',\n border: '1px solid #2a2a2a',\n borderRadius: '4px',\n overflow: 'hidden',\n }}\n >\n {langs.map((l) => {\n const active = lang === l\n return (\n <button\n key={l}\n type=\"button\"\n aria-pressed={active}\n data-lang={l}\n onClick={() => setLang(l)}\n style={{\n background: active ? '#2a2a2a' : 'transparent',\n color: active ? '#e6e6e6' : '#888',\n border: 'none',\n cursor: 'pointer',\n fontSize: '11px',\n padding: '2px 8px',\n fontWeight: active ? 600 : 400,\n }}\n >\n {labels[l]}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport function Panel(props: PanelProps) {\n const { result, onClose, position = 'bottom-right', resolveFrame } = props\n const { t } = useI18n()\n const grouped = useMemo(() => groupByKind(result.signals), [result.signals])\n const kindsPresent = KIND_ORDER.filter((k) => grouped[k].length > 0)\n const unsupported = useMemo(() => unsupportedKinds(), [])\n const hasTimelineSignals =\n result.signals.some((s) => s.kind !== 'web-vital') ||\n (result.heapSamples?.length ?? 0) > 0 ||\n (result.frames?.length ?? 0) > 0 ||\n (result.leakSuspects?.length ?? 0) > 0\n const [activeTab, setActiveTab] = useState<ActiveTab>(\n kindsPresent[0] ?? 'forced-reflow',\n )\n const activeKind: SignalKind | null = activeTab === 'timeline' ? null : activeTab\n const setActiveKind = (k: SignalKind) => setActiveTab(k)\n const [expandedKey, setExpandedKey] = useState<string | null>(null)\n const [groupMode, setGroupMode] = useState<Partial<Record<SignalKind, GroupMode>>>({})\n const [sortMode, setSortMode] = useState<Partial<Record<SignalKind, SortMode>>>({})\n const [filterText, setFilterText] = useState<Partial<Record<SignalKind, string>>>({})\n const activeOverlayCount = useRef(0)\n\n useEffect(() => () => hideAllOverlays(), [])\n\n function handleHover(signal: LayoutShiftSignal | null) {\n if (!signal) {\n for (let i = 0; i < activeOverlayCount.current; i++) {\n hideOverlay(`signal-${i}`)\n hideOverlay(`signal-prev-${i}`)\n hideArrow(`signal-arrow-${i}`)\n }\n activeOverlayCount.current = 0\n return\n }\n const sev = severityForSignal(signal)\n const color = SEVERITY_OVERLAY_COLOR[sev]\n const fillAlpha = sev === 'high' ? 0.2 : sev === 'medium' ? 0.16 : 0.14\n const fillRgba = hexToRgba(color, fillAlpha)\n signal.sources.forEach((r, i) => {\n // Skip sources with no current geometry — these typically represent\n // detached/removed nodes. Drawing an overlay (or worse, an arrow\n // pointing at 0,0) would be confusing noise.\n if (r.width <= 0 || r.height <= 0) return\n showOverlay(`signal-${i}`, r, { border: color, fill: fillRgba })\n const prev = signal.previousSources?.[i] ?? null\n if (prev && prev.width > 0 && prev.height > 0) {\n showOverlay(`signal-prev-${i}`, prev, {\n border: color,\n fill: 'transparent',\n dashed: true,\n })\n const from = { x: prev.x + prev.width / 2, y: prev.y + prev.height / 2 }\n const to = { x: r.x + r.width / 2, y: r.y + r.height / 2 }\n const dx = to.x - from.x\n const dy = to.y - from.y\n if (Math.hypot(dx, dy) > 8) {\n showArrow(`signal-arrow-${i}`, from, to, color)\n }\n }\n })\n activeOverlayCount.current = signal.sources.length\n }\n\n const panelStyle = {\n position: 'fixed' as const,\n ...POSITION_STYLES[position],\n width: '460px',\n maxHeight: '70vh',\n background: '#0d0d0d',\n color: '#e6e6e6',\n border: '1px solid #2a2a2a',\n borderRadius: '12px',\n padding: '12px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: '12px',\n zIndex: '2147483647',\n boxShadow: '0 8px 32px rgba(0,0,0,0.4)',\n display: 'flex',\n flexDirection: 'column' as const,\n overflow: 'hidden',\n }\n\n return (\n <div role=\"region\" aria-label={t.panelRegion} style={panelStyle}>\n <header style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '8px' }}>\n <strong>react-perfscope</strong>\n <div style={{ display: 'flex', gap: '4px', alignItems: 'center' }}>\n <LanguageToggle />\n <button\n type=\"button\"\n aria-label={t.saveAria}\n onClick={() => downloadRecording(result)}\n title={t.saveTitle}\n style={{\n background: 'transparent',\n color: '#e6e6e6',\n border: '1px solid #2a2a2a',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '11px',\n padding: '2px 8px',\n }}\n >\n {t.save}\n </button>\n <button\n type=\"button\"\n aria-label={t.closeAria}\n onClick={onClose}\n style={{ background: 'transparent', color: '#e6e6e6', border: 'none', cursor: 'pointer', fontSize: '16px' }}\n >\n ×\n </button>\n </div>\n </header>\n\n {unsupported.length > 0 && (\n <div\n style={{\n padding: '6px 8px',\n marginBottom: '8px',\n fontSize: '11px',\n color: '#888',\n background: '#141414',\n border: '1px solid #1f1f1f',\n borderRadius: '6px',\n }}\n >\n {t.unsupportedInBrowser(unsupported.map((k) => t.kindLabel(k)).join(', '))}\n </div>\n )}\n\n {kindsPresent.length === 0 && (\n <div style={{ color: '#888' }}>{t.noSignals}</div>\n )}\n\n {kindsPresent.length > 0 && (\n <>\n <SummaryHeader\n signals={result.signals}\n grouped={grouped}\n kindsPresent={kindsPresent}\n onKindClick={(k) => { setActiveTab(k); setExpandedKey(null) }}\n />\n <nav style={{ display: 'flex', gap: '4px', flexWrap: 'wrap', marginBottom: '8px' }}>\n {hasTimelineSignals && (\n <button\n key=\"timeline\"\n type=\"button\"\n data-kind=\"timeline\"\n onClick={() => { setActiveTab('timeline'); setExpandedKey(null) }}\n style={{\n background: activeTab === 'timeline' ? '#2a2a2a' : '#1a1a1a',\n color: '#e6e6e6',\n border: '1px solid #2a2a2a',\n borderRadius: '6px',\n padding: '4px 8px',\n cursor: 'pointer',\n fontSize: '11px',\n }}\n >\n {t.timeline}\n </button>\n )}\n {kindsPresent.map((kind) => {\n const worst = worstSeverity(grouped[kind])\n const active = activeKind === kind\n return (\n <button\n key={kind}\n type=\"button\"\n data-kind={kind}\n data-worst-severity={worst}\n onClick={() => { setActiveTab(kind); setExpandedKey(null) }}\n style={{\n background: active ? '#2a2a2a' : '#1a1a1a',\n color: '#e6e6e6',\n border: `1px solid ${worst === 'low' ? '#2a2a2a' : SEVERITY_COLOR[worst]}`,\n borderRadius: '6px',\n padding: '4px 8px',\n cursor: 'pointer',\n fontSize: '11px',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n {worst !== 'low' && <SeverityDot sev={worst} title={t.worstLabel(worst)} />}\n {t.kindLabel(kind)} {grouped[kind].length}\n </button>\n )\n })}\n </nav>\n\n {activeKind && activeTab !== 'timeline' && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: '6px', fontSize: '11px', color: '#888', flexWrap: 'wrap' }}>\n <label style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {t.sort}\n <select\n aria-label={t.sort}\n value={sortMode[activeKind] ?? 'chronological'}\n onChange={(e) => {\n const v = (e.target as HTMLSelectElement).value as SortMode\n setSortMode({ ...sortMode, [activeKind]: v })\n setExpandedKey(null)\n }}\n style={{ background: '#1a1a1a', color: '#e6e6e6', border: '1px solid #2a2a2a', borderRadius: '4px', padding: '2px 6px', fontSize: '11px' }}\n >\n <option value=\"chronological\">{t.sortChronological}</option>\n <option value=\"severity\">{t.sortSeverity}</option>\n </select>\n </label>\n {tabSupportsGrouping(activeKind) && (\n <label style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {t.groupBy}\n <select\n aria-label={t.groupBy}\n value={groupMode[activeKind] ?? 'chronological'}\n onChange={(e) => {\n const v = (e.target as HTMLSelectElement).value as GroupMode\n setGroupMode({ ...groupMode, [activeKind]: v })\n setExpandedKey(null)\n }}\n style={{ background: '#1a1a1a', color: '#e6e6e6', border: '1px solid #2a2a2a', borderRadius: '4px', padding: '2px 6px', fontSize: '11px' }}\n >\n <option value=\"chronological\">{t.groupChronological}</option>\n {activeKind === 'render' && <option value=\"commit\">{t.groupCommit}</option>}\n {activeKind === 'render' && <option value=\"component\">{t.groupComponent}</option>}\n {activeKind === 'forced-reflow' && <option value=\"source\">{t.groupSource}</option>}\n </select>\n </label>\n )}\n <input\n type=\"text\"\n aria-label={t.filterAria}\n placeholder={t.filterPlaceholder}\n value={filterText[activeKind] ?? ''}\n onInput={(e) => {\n setFilterText({ ...filterText, [activeKind]: (e.target as HTMLInputElement).value })\n setExpandedKey(null)\n }}\n style={{ marginLeft: 'auto', background: '#1a1a1a', color: '#e6e6e6', border: '1px solid #2a2a2a', borderRadius: '4px', padding: '2px 6px', fontSize: '11px', width: '120px' }}\n />\n </div>\n )}\n\n {activeTab === 'timeline' && (\n <div style={{ flexGrow: 1, overflowY: 'auto', paddingTop: '4px', paddingBottom: '24px' }}>\n <LeakList suspects={result.leakSuspects} />\n <Timeline\n signals={result.signals}\n duration={result.duration}\n startedAt={result.startedAt}\n heapSamples={result.heapSamples}\n frames={result.frames}\n onJump={(s) => {\n setActiveTab(s.kind)\n const inOrder = grouped[s.kind]\n const idx = inOrder.indexOf(s)\n if (idx >= 0) setExpandedKey(`${s.kind}-${idx}`)\n }}\n />\n </div>\n )}\n {activeKind === 'render' && activeTab !== 'timeline' && (\n <RenderInsights\n signals={grouped.render\n .flatMap((s) => (s.kind === 'render' ? s.members ?? [s] : []))\n .filter((s) => signalMatchesFilter(s, filterText.render ?? ''))}\n onSelect={() => {\n setGroupMode({ ...groupMode, render: 'component' })\n setExpandedKey(null)\n }}\n />\n )}\n {activeKind === 'long-task' && activeTab !== 'timeline' && (\n <LongTaskEpisode signals={result.signals} />\n )}\n {activeKind === 'layout-shift' && activeTab !== 'timeline' && (\n <div\n style={{\n padding: '6px 8px',\n marginBottom: '6px',\n fontSize: '11px',\n color: '#888',\n background: '#141414',\n border: '1px solid #1f1f1f',\n borderRadius: '6px',\n }}\n >\n {t.layoutShiftHint}\n </div>\n )}\n {activeKind === 'interaction' && activeTab !== 'timeline' && (\n <>\n <InpEpisode signals={result.signals} />\n <div\n style={{\n padding: '6px 8px',\n marginBottom: '6px',\n fontSize: '11px',\n color: '#888',\n background: '#141414',\n border: '1px solid #1f1f1f',\n borderRadius: '6px',\n }}\n >\n {t.interactionThresholdHint}\n </div>\n </>\n )}\n <ul style={{ listStyle: 'none', margin: 0, padding: 0, overflowY: 'auto', flexGrow: 1, display: activeTab === 'timeline' ? 'none' : undefined }}>\n {activeKind && (() => {\n const filtered = grouped[activeKind].filter((s) =>\n signalMatchesFilter(s, filterText[activeKind] ?? ''),\n )\n const baseSignals = (sortMode[activeKind] ?? 'chronological') === 'severity'\n ? sortSignalsBySeverity(filtered)\n : filtered\n return groupSignals(baseSignals, groupMode[activeKind] ?? 'chronological', activeKind)\n })().map((g, gi) => {\n const currentMode = groupMode[activeKind] ?? 'chronological'\n if (currentMode === 'chronological') {\n const key = `${activeKind}-${gi}`\n return (\n <SignalRow\n key={key}\n signal={g.signals[0]!}\n expanded={expandedKey === key}\n onToggleExpand={() => setExpandedKey(expandedKey === key ? null : key)}\n onHoverGeometry={handleHover}\n resolveFrame={resolveFrame}\n />\n )\n }\n const key = `${activeKind}-group-${gi}`\n const isOpen = expandedKey === key\n const isCascade = activeKind === 'render' && currentMode === 'commit'\n const renderMembers = g.signals.filter((s): s is RenderSignal => s.kind === 'render')\n const unnecessary = isCascade ? renderMembers.filter((s) => s.reason === 'parent').length : 0\n return (\n <li\n key={key}\n aria-expanded={isOpen}\n onClick={() => setExpandedKey(isOpen ? null : key)}\n style={{\n padding: '6px 8px',\n borderTop: '1px solid #1a1a1a',\n borderLeft: unnecessary > 0 ? `3px solid ${RENDER_REASON_COLOR.parent}` : undefined,\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n cursor: 'pointer',\n userSelect: 'none' as const,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', flexWrap: 'wrap' }}>\n <span style={{ color: '#888', width: '10px' }}>{isOpen ? '▼' : '▶'}</span>\n <span><strong>{g.label}</strong> ×{g.count}</span>\n {isCascade && unnecessary > 0 && (\n <span style={{ color: RENDER_REASON_COLOR.parent, fontSize: '10px' }}>\n ⚠ {t.unnecessaryRenders(unnecessary)}\n </span>\n )}\n </div>\n {isOpen && (\n <div style={{ marginTop: '6px', paddingTop: '6px', borderTop: '1px dashed #2a2a2a', paddingLeft: '8px' }}>\n {isCascade ? (\n <CascadeMembers members={renderMembers} />\n ) : (\n <>\n {g.signals.slice(0, 20).map((s, si) => (\n <div key={si} style={{ padding: '2px 0' }}>\n <SummaryLine signal={s} />\n </div>\n ))}\n {g.signals.length > 20 && (\n <div style={{ color: '#888', marginTop: '4px' }}>{t.moreItems(g.signals.length - 20)}</div>\n )}\n </>\n )}\n </div>\n )}\n </li>\n )\n })}\n </ul>\n {activeKind &&\n activeTab !== 'timeline' &&\n (filterText[activeKind] ?? '').trim() !== '' &&\n grouped[activeKind].length > 0 &&\n grouped[activeKind].every((s) => !signalMatchesFilter(s, filterText[activeKind] ?? '')) && (\n <div style={{ padding: '12px 8px', fontSize: '11px', color: '#888' }}>\n {t.filterNoMatches}\n </div>\n )}\n </>\n )}\n </div>\n )\n}\n","const OVERLAY_MARKER = 'data-perfscope-overlay'\nconst ARROW_MARKER = 'data-perfscope-overlay-arrow'\nconst FADE_MS = 80\n\nconst DEFAULT_BORDER = '#ff3b30'\nconst DEFAULT_FILL = 'rgba(255, 59, 48, 0.12)'\n\nexport interface OverlayStyle {\n /** Border color (CSS color). Defaults to red. */\n border?: string\n /** Background fill (CSS color). Defaults to translucent red. */\n fill?: string\n /** Optional dashed border for \"previous position\" overlays. */\n dashed?: boolean\n}\n\nfunction getOrCreate(id: string): HTMLElement {\n const existing = document.querySelector(`[${OVERLAY_MARKER}=\"${id}\"]`)\n if (existing) return existing as HTMLElement\n const el = document.createElement('div')\n el.setAttribute(OVERLAY_MARKER, id)\n // position:absolute (not fixed) so the highlight tracks the shifted\n // DOM position when the user scrolls. Coordinates passed to showOverlay\n // are document-relative (already adjusted by the layout-shift collector).\n el.style.position = 'absolute'\n el.style.pointerEvents = 'none'\n el.style.boxSizing = 'border-box'\n el.style.border = `2px solid ${DEFAULT_BORDER}`\n el.style.background = DEFAULT_FILL\n el.style.zIndex = '2147483646'\n el.style.borderRadius = '2px'\n el.style.transition = `opacity ${FADE_MS}ms ease-out`\n document.body.appendChild(el)\n return el\n}\n\nexport function showOverlay(id: string, rect: DOMRect, style?: OverlayStyle): void {\n const el = getOrCreate(id)\n el.style.left = `${rect.left}px`\n el.style.top = `${rect.top}px`\n el.style.width = `${rect.width}px`\n el.style.height = `${rect.height}px`\n el.style.opacity = '1'\n const border = style?.border ?? DEFAULT_BORDER\n const fill = style?.fill ?? DEFAULT_FILL\n el.style.borderStyle = style?.dashed ? 'dashed' : 'solid'\n el.style.borderColor = border\n el.style.background = fill\n}\n\n/**\n * Draws a translucent SVG arrow between two document-coord points.\n * Useful for visualising a layout-shift's previous → current position.\n * The arrow is appended to document.body as a single absolutely-positioned\n * SVG that spans the bounding box of the two points.\n */\nexport function showArrow(\n id: string,\n from: { x: number; y: number },\n to: { x: number; y: number },\n color: string = DEFAULT_BORDER,\n): void {\n // Reuse / replace existing arrow for this id\n let svg = document.querySelector(`[${ARROW_MARKER}=\"${id}\"]`) as SVGSVGElement | null\n if (!svg) {\n svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg') as SVGSVGElement\n svg.setAttribute(ARROW_MARKER, id)\n svg.style.position = 'absolute'\n svg.style.pointerEvents = 'none'\n svg.style.overflow = 'visible'\n svg.style.zIndex = '2147483646'\n svg.style.transition = `opacity ${FADE_MS}ms ease-out`\n document.body.appendChild(svg)\n }\n // Position the SVG at the bounding box, draw the arrow in local coords\n const minX = Math.min(from.x, to.x)\n const minY = Math.min(from.y, to.y)\n const w = Math.max(2, Math.abs(to.x - from.x))\n const h = Math.max(2, Math.abs(to.y - from.y))\n svg.style.left = `${minX}px`\n svg.style.top = `${minY}px`\n svg.setAttribute('width', `${w}`)\n svg.setAttribute('height', `${h}`)\n svg.setAttribute('viewBox', `0 0 ${w} ${h}`)\n svg.style.opacity = '1'\n\n while (svg.firstChild) svg.removeChild(svg.firstChild)\n\n const fx = from.x - minX\n const fy = from.y - minY\n const tx = to.x - minX\n const ty = to.y - minY\n\n const markerId = `perfscope-arrowhead-${id}`\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker')\n marker.setAttribute('id', markerId)\n marker.setAttribute('viewBox', '0 0 10 10')\n marker.setAttribute('refX', '8')\n marker.setAttribute('refY', '5')\n marker.setAttribute('markerWidth', '6')\n marker.setAttribute('markerHeight', '6')\n marker.setAttribute('orient', 'auto-start-reverse')\n const arrowPath = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n arrowPath.setAttribute('d', 'M 0 0 L 10 5 L 0 10 z')\n arrowPath.setAttribute('fill', color)\n marker.appendChild(arrowPath)\n defs.appendChild(marker)\n svg.appendChild(defs)\n\n const line = document.createElementNS('http://www.w3.org/2000/svg', 'line')\n line.setAttribute('x1', `${fx}`)\n line.setAttribute('y1', `${fy}`)\n line.setAttribute('x2', `${tx}`)\n line.setAttribute('y2', `${ty}`)\n line.setAttribute('stroke', color)\n line.setAttribute('stroke-width', '3')\n line.setAttribute('stroke-linecap', 'round')\n line.setAttribute('marker-end', `url(#${markerId})`)\n svg.appendChild(line)\n}\n\nexport function hideArrow(id: string): void {\n const svg = document.querySelector(`[${ARROW_MARKER}=\"${id}\"]`)\n if (svg) svg.remove()\n}\n\n/**\n * Trigger the fade-out transition and remove the overlay after it completes.\n * If the overlay is shown again before the fade timer fires, the timer is\n * cancelled and the element is kept.\n */\nexport function hideOverlay(id: string): void {\n const el = document.querySelector(`[${OVERLAY_MARKER}=\"${id}\"]`) as HTMLElement | null\n if (!el) return\n el.style.opacity = '0'\n setTimeout(() => {\n // Re-check existence in case the caller re-showed the overlay during the fade\n const stillThere = document.querySelector(`[${OVERLAY_MARKER}=\"${id}\"]`)\n if (stillThere && (stillThere as HTMLElement).style.opacity === '0') {\n stillThere.remove()\n }\n }, FADE_MS + 20)\n}\n\n/**\n * Remove every overlay immediately, skipping the fade. Used by Panel\n * unmount cleanup where we don't want lingering overlays.\n */\nexport function hideAllOverlays(): void {\n for (const el of Array.from(document.querySelectorAll(`[${OVERLAY_MARKER}]`))) {\n el.remove()\n }\n for (const el of Array.from(document.querySelectorAll(`[${ARROW_MARKER}]`))) {\n el.remove()\n }\n}\n","import type { Signal, SignalKind, WebVitalSignal } from '@react-perfscope/core'\n\nexport type Severity = 'low' | 'medium' | 'high'\nexport type Rating = 'good' | 'needs' | 'poor'\n\nexport const SEVERITY_COLOR: Record<Severity, string> = {\n low: '#666',\n medium: '#ff9500',\n high: '#ff3b30',\n}\n\n/**\n * Brighter palette used for overlays drawn on top of the page. The\n * row-/tab-level `SEVERITY_COLOR.low` (#666) is intentionally muted\n * for in-panel chrome, but on the live page that gray vanishes against\n * normal page contents. Overlays use saturated hues so the shifted\n * region is always visible, regardless of severity bucket.\n */\nexport const SEVERITY_OVERLAY_COLOR: Record<Severity, string> = {\n low: '#3b82f6',\n medium: '#ff9500',\n high: '#ff3b30',\n}\n\nexport const RATING_COLOR: Record<Rating, string> = {\n good: '#34c759',\n needs: '#ff9500',\n poor: '#ff3b30',\n}\n\nconst WEB_VITAL_THRESHOLDS: Record<WebVitalSignal['name'], [number, number]> = {\n LCP: [2500, 4000],\n INP: [200, 500],\n CLS: [0.1, 0.25],\n FCP: [1800, 3000],\n TTFB: [800, 1800],\n}\n\nexport function webVitalRating(name: WebVitalSignal['name'], value: number): Rating {\n const [good, needs] = WEB_VITAL_THRESHOLDS[name]\n if (value <= good) return 'good'\n if (value <= needs) return 'needs'\n return 'poor'\n}\n\nconst SEVERITY_RANK: Record<Severity, number> = { low: 0, medium: 1, high: 2 }\nconst RATING_RANK: Record<Rating, number> = { good: 0, needs: 1, poor: 2 }\n\nexport function severityForSignal(s: Signal): Severity {\n switch (s.kind) {\n case 'long-task':\n if (s.duration >= 100) return 'high'\n if (s.duration >= 50) return 'medium'\n return 'low'\n case 'forced-reflow':\n if (s.duration >= 20) return 'high'\n if (s.duration >= 5) return 'medium'\n return 'low'\n case 'layout-shift':\n if (s.value >= 0.1) return 'high'\n if (s.value >= 0.05) return 'medium'\n return 'low'\n case 'render':\n // 60fps frame budget = 16.6ms. >1 frame = medium, >2 = high.\n if (s.duration >= 33) return 'high'\n if (s.duration >= 16) return 'medium'\n return 'low'\n case 'network':\n if (s.blocking && s.duration >= 500) return 'high'\n if (s.duration >= 1000) return 'high'\n if (s.duration >= 500) return 'medium'\n return 'low'\n case 'web-vital': {\n const rating = webVitalRating(s.name, s.value)\n return rating === 'poor' ? 'high' : rating === 'needs' ? 'medium' : 'low'\n }\n case 'interaction':\n // Official INP thresholds: good < 200ms, needs-improvement < 500ms.\n if (s.duration >= 500) return 'high'\n if (s.duration >= 200) return 'medium'\n return 'low'\n }\n}\n\nexport function worstSeverity(signals: Signal[]): Severity {\n let worst: Severity = 'low'\n for (const s of signals) {\n const sev = severityForSignal(s)\n if (SEVERITY_RANK[sev] > SEVERITY_RANK[worst]) worst = sev\n }\n return worst\n}\n\nexport function severityRank(sev: Severity): number {\n return SEVERITY_RANK[sev]\n}\n\nexport function ratingRank(r: Rating): number {\n return RATING_RANK[r]\n}\n\nexport const KIND_LABEL: Record<SignalKind, string> = {\n 'forced-reflow': 'forced-reflow',\n 'layout-shift': 'layout-shift',\n 'long-task': 'long-task',\n 'interaction': 'interaction',\n 'network': 'network',\n 'web-vital': 'web-vital',\n 'render': 'render',\n}\n","import { h } from 'preact'\nimport type { Signal, SignalKind, WebVitalSignal } from '@react-perfscope/core'\nimport { SEVERITY_COLOR, RATING_COLOR, worstSeverity, webVitalRating } from './severity'\nimport { useI18n } from './i18n'\n\ninterface SummaryHeaderProps {\n signals: Signal[]\n grouped: Record<SignalKind, Signal[]>\n kindsPresent: SignalKind[]\n onKindClick?: (kind: SignalKind) => void\n}\n\nconst WEB_VITAL_UNIT: Record<WebVitalSignal['name'], string> = {\n LCP: 'ms',\n INP: 'ms',\n CLS: '',\n FCP: 'ms',\n TTFB: 'ms',\n}\n\nfunction formatVitalValue(name: WebVitalSignal['name'], value: number): string {\n if (name === 'CLS') return value.toFixed(3)\n if (value >= 1000) return (value / 1000).toFixed(2) + 's'\n return value.toFixed(0)\n}\n\nfunction VitalChip({ s }: { s: WebVitalSignal }) {\n const { t } = useI18n()\n const rating = webVitalRating(s.name, s.value)\n const color = RATING_COLOR[rating]\n const unit = WEB_VITAL_UNIT[s.name]\n return (\n <span\n data-vital={s.name}\n data-rating={rating}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '5px',\n padding: '3px 8px',\n borderRadius: '999px',\n background: '#1a1a1a',\n border: `1px solid ${color}33`,\n fontSize: '11px',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n }}\n >\n <span\n aria-label={t.ratingLabel(rating)}\n style={{\n width: '6px',\n height: '6px',\n borderRadius: '50%',\n background: color,\n flex: '0 0 6px',\n }}\n />\n <strong style={{ color: '#e6e6e6' }}>{s.name}</strong>\n <span style={{ color }}>\n {formatVitalValue(s.name, s.value)}\n {unit !== 's' ? unit : ''}\n </span>\n </span>\n )\n}\n\nexport function SummaryHeader({ signals, grouped, kindsPresent, onKindClick }: SummaryHeaderProps) {\n const { t } = useI18n()\n // Latest web-vital per name — vitals can be re-reported and the freshest\n // value is what matters in the summary.\n const latestVitals = new Map<WebVitalSignal['name'], WebVitalSignal>()\n for (const s of signals) {\n if (s.kind === 'web-vital') latestVitals.set(s.name, s)\n }\n const vitals = Array.from(latestVitals.values())\n const nonVitalKinds = kindsPresent.filter((k) => k !== 'web-vital')\n\n return (\n <div\n style={{\n marginBottom: '8px',\n padding: '8px 10px',\n background: '#141414',\n border: '1px solid #1f1f1f',\n borderRadius: '8px',\n display: 'flex',\n flexDirection: 'column',\n gap: '6px',\n }}\n >\n {vitals.length > 0 && (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: '4px' }}>\n {vitals.map((v) => (\n <VitalChip key={v.name} s={v} />\n ))}\n </div>\n )}\n {nonVitalKinds.length > 0 && (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: '10px',\n fontSize: '11px',\n color: '#aaa',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n }}\n >\n {nonVitalKinds.map((k) => {\n const list = grouped[k]\n const sev = worstSeverity(list)\n const color = sev === 'low' ? '#aaa' : SEVERITY_COLOR[sev]\n return (\n <span\n key={k}\n data-summary-kind={k}\n onClick={() => onKindClick?.(k)}\n style={{\n cursor: onKindClick ? 'pointer' : 'default',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n }}\n title={t.signalsTitle(list.length, t.kindLabel(k))}\n >\n {sev !== 'low' && (\n <span\n style={{\n width: '6px',\n height: '6px',\n borderRadius: '50%',\n background: color,\n flex: '0 0 6px',\n }}\n />\n )}\n <span>{t.kindLabel(k)}</span>\n <strong style={{ color }}>{list.length}</strong>\n </span>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","import { h, Fragment } from 'preact'\nimport { useLayoutEffect, useMemo, useRef, useState } from 'preact/hooks'\nimport type { Signal, SignalKind, HeapSample, HeapTrendClass } from '@react-perfscope/core'\nimport { analyzeHeapTrend, analyzeFrames } from '@react-perfscope/core'\nimport { severityForSignal, SEVERITY_OVERLAY_COLOR } from './severity'\nimport { useI18n } from './i18n'\n\ninterface TimelineProps {\n signals: Signal[]\n /** Recording duration in ms. */\n duration: number\n /** Recording start time (performance.now() value). Used to convert\n * absolute signal timestamps to recording-relative ones. */\n startedAt: number\n /** Heap-usage series, when performance.memory was available. */\n heapSamples?: HeapSample[]\n /** requestAnimationFrame timestamps for the frame-rate strip. */\n frames?: number[]\n onJump?: (signal: Signal) => void\n}\n\nconst LANE_ORDER: SignalKind[] = [\n 'long-task',\n 'interaction',\n 'forced-reflow',\n 'layout-shift',\n 'render',\n 'network',\n]\n\nfunction signalAbsoluteTime(s: Signal): number | null {\n if (s.kind === 'web-vital') return null\n if (s.kind === 'network') return s.startedAt\n return s.at\n}\n\nfunction signalDuration(s: Signal): number {\n if (\n s.kind === 'long-task' ||\n s.kind === 'forced-reflow' ||\n s.kind === 'render' ||\n s.kind === 'network' ||\n s.kind === 'interaction'\n ) {\n return s.duration\n }\n return 0\n}\n\nfunction formatTime(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`\n if (ms >= 1) return `${ms.toFixed(0)}ms`\n return `${ms.toFixed(1)}ms`\n}\n\nfunction niceStep(span: number, target: number): number {\n const raw = Math.max(span, 1) / target\n const mag = Math.pow(10, Math.floor(Math.log10(raw)))\n const norm = raw / mag\n if (norm < 1.5) return 1 * mag\n if (norm < 3) return 2 * mag\n if (norm < 7) return 5 * mag\n return 10 * mag\n}\n\n// Ticks at \"nice\" absolute times that fall inside the [start, end] window.\nfunction niceTicks(start: number, end: number, target = 5): number[] {\n const span = Math.max(end - start, 1)\n const step = niceStep(span, target)\n const first = Math.ceil(start / step) * step\n const ticks: number[] = []\n for (let t = first; t <= end + 1e-6; t += step) ticks.push(t)\n return ticks\n}\n\nconst LANE_HEIGHT = 28\n// Network requests fire in parallel and overlap in time, so a single row would\n// stack them on top of each other. The network lane lays overlapping bars onto\n// separate rows (a waterfall) and grows its height to fit.\nconst NET_BAR_H = 7\nconst NET_ROW_GAP = 3\n// Per-row brightness steps for stacked network bars. Non-monotonic so adjacent\n// rows always contrast, and it never lands back on the previous value.\nconst NET_ROW_BRIGHTNESS = [1, 0.78, 1.22, 0.9, 1.12]\n// Wide enough for the longest lane label (\"forced-reflow\") plus its count\n// badge, so every lane's track starts at the same x and 0.0ms lines up.\nconst LABEL_COL_WIDTH = 124\nconst AXIS_HEIGHT = 22\nconst TRACK_PAD_X = 4\nconst MIN_BAR_W = 6\nconst MARKER_D = 9\n// Point events within this many ms of each other merge into one marker. An\n// absolute time window (not a fraction of the recording) so a long recording\n// doesn't over-merge events that are actually far apart — roughly one frame.\nconst CLUSTER_BIN_MS = 16\n// Minimum horizontal density. When fitting the whole recording into the visible\n// track would squeeze it below this, the track grows to a fixed pixel width and\n// scrolls instead, so dense early bursts stay legible in long recordings.\nconst MIN_PX_PER_SEC = 80\n\ninterface Plotted {\n s: Signal\n // [0, 1] left position within the track\n startFrac: number\n // [0, 1] width within the track (0 for instants)\n widthFrac: number\n}\n\nfunction plotLane(\n signals: Signal[],\n kind: SignalKind,\n winStart: number,\n winEnd: number,\n startedAt: number,\n): Plotted[] {\n const span = Math.max(winEnd - winStart, 1)\n const out: Plotted[] = []\n for (const s of signals) {\n if (s.kind !== kind) continue\n const tAbs = signalAbsoluteTime(s)\n if (tAbs == null) continue\n const t = tAbs - startedAt - winStart\n const d = signalDuration(s)\n const startFrac = Math.max(0, Math.min(1, t / span))\n const widthFrac = Math.max(0, Math.min(1 - startFrac, d / span))\n out.push({ s, startFrac, widthFrac })\n }\n return out\n}\n\n// Greedy waterfall packing: place each bar on the first row whose last bar ends\n// (visually, in px, honoring MIN_BAR_W) before this one starts. Bars must be\n// sorted by startFrac. Returns each bar's row index and the total row count so\n// the lane can size itself. Lets overlapping parallel requests sit side-by-side\n// on separate rows instead of hiding behind each other.\nfunction packRows(bars: Plotted[], trackInnerPx: number): { rows: number[]; rowCount: number } {\n const GAP_PX = 2\n const rowEnds: number[] = []\n const rows: number[] = []\n for (const b of bars) {\n const startPx = b.startFrac * trackInnerPx\n const endPx = startPx + Math.max(MIN_BAR_W, b.widthFrac * trackInnerPx)\n let placed = -1\n for (let r = 0; r < rowEnds.length; r++) {\n if (startPx >= rowEnds[r]! + GAP_PX) {\n placed = r\n break\n }\n }\n if (placed === -1) {\n placed = rowEnds.length\n rowEnds.push(0)\n }\n rowEnds[placed] = endPx\n rows.push(placed)\n }\n return { rows, rowCount: Math.max(1, rowEnds.length) }\n}\n\ntype Severity = 'low' | 'medium' | 'high'\nconst SEV_RANK: Record<Severity, number> = { low: 0, medium: 1, high: 2 }\n\ninterface PointCluster {\n startFrac: number\n count: number\n rep: Signal\n worst: Severity\n members: Signal[]\n}\n\n// Collapse the visual noise of many near-simultaneous point events (e.g. 58\n// forced-reflows in a 5ms burst, or a whole component tree re-rendering in one\n// commit) into a single marker carrying a count. Items wide enough to read as a\n// duration bar are left alone; only point-like items within `binFrac` of each\n// other are merged. `binFrac` is the caller's time window (CLUSTER_BIN_MS)\n// expressed as a fraction of the recording, so merging tracks real elapsed time\n// rather than a fixed slice of the bar — a long recording won't fuse events\n// that are seconds apart. The representative signal is the worst-severity one so\n// the marker color stays honest, and every merged signal is kept in `members`\n// so the tooltip can list what actually happened (which components rendered).\nfunction clusterLane(items: Plotted[], binFrac: number): { bars: Plotted[]; clusters: PointCluster[] } {\n const bars: Plotted[] = []\n const pts: Plotted[] = []\n for (const it of items) {\n if (it.widthFrac >= binFrac) bars.push(it)\n else pts.push(it)\n }\n pts.sort((a, b) => a.startFrac - b.startFrac)\n const clusters: PointCluster[] = []\n let i = 0\n while (i < pts.length) {\n const start = pts[i]!.startFrac\n let rep = pts[i]!.s\n let worst = severityForSignal(pts[i]!.s)\n let sum = 0\n let j = i\n const members: Signal[] = []\n while (j < pts.length && pts[j]!.startFrac - start <= binFrac) {\n const sev = severityForSignal(pts[j]!.s)\n if (SEV_RANK[sev] > SEV_RANK[worst]) {\n worst = sev\n rep = pts[j]!.s\n }\n members.push(pts[j]!.s)\n sum += pts[j]!.startFrac\n j++\n }\n clusters.push({ startFrac: sum / members.length, count: members.length, rep, worst, members })\n i = j\n }\n return { bars, clusters }\n}\n\n// Distinct component names in a render cluster, with how many times each\n// rendered, ordered by first appearance — drives the tooltip breakdown so a\n// single marker can tell you the whole commit rendered App, Counter, ….\nfunction renderBreakdown(members: Signal[]): { component: string; count: number }[] {\n const order: string[] = []\n const counts = new Map<string, number>()\n for (const s of members) {\n if (s.kind !== 'render') continue\n // Render signals are coalesced per commit; count each component that\n // re-rendered inside them.\n for (const m of s.members ?? [s]) {\n if (!counts.has(m.component)) order.push(m.component)\n counts.set(m.component, (counts.get(m.component) ?? 0) + 1)\n }\n }\n return order.map((c) => ({ component: c, count: counts.get(c)! }))\n}\n\nconst HEAP_STRIP_H = 46\n// SVG drawn in a fixed unit box and stretched to the track width via\n// preserveAspectRatio=\"none\", so x lines up with the signal lanes below.\nconst HEAP_VB_W = 100\nconst HEAP_VB_H = 100\nconst HEAP_TREND_COLOR: Record<HeapTrendClass, string> = {\n stable: '#3b82f6',\n growing: '#f59e0b',\n 'leak-suspected': '#ef4444',\n}\n\nfunction formatBytes(b: number): string {\n if (b >= 1024 * 1024) return `${(b / (1024 * 1024)).toFixed(1)}MB`\n if (b >= 1024) return `${(b / 1024).toFixed(0)}KB`\n return `${b}B`\n}\n\n// Build the area + line SVG paths (in the unit viewBox) plus the heap range,\n// scaling `used` across [min,max] so the sawtooth fills the strip vertically.\nfunction buildHeapPaths(\n samples: HeapSample[],\n startedAt: number,\n safeDur: number,\n): { area: string; line: string; min: number; max: number } | null {\n if (samples.length === 0) return null\n let lo = Infinity\n let hi = -Infinity\n for (const s of samples) {\n if (s.used < lo) lo = s.used\n if (s.used > hi) hi = s.used\n }\n const range = Math.max(hi - lo, 1)\n const pts = samples.map((s) => {\n const x = Math.max(0, Math.min(HEAP_VB_W, ((s.at - startedAt) / safeDur) * HEAP_VB_W))\n const y = HEAP_VB_H - ((s.used - lo) / range) * HEAP_VB_H\n return { x, y }\n })\n const line = pts.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(2)} ${p.y.toFixed(2)}`).join(' ')\n const last = pts[pts.length - 1]!\n const first = pts[0]!\n const area = `${line} L${last.x.toFixed(2)} ${HEAP_VB_H} L${first.x.toFixed(2)} ${HEAP_VB_H} Z`\n return { area, line, min: lo, max: hi }\n}\n\nfunction HeapStrip({\n samples,\n startedAt,\n safeDur,\n trackWidth,\n scrolls,\n}: {\n samples: HeapSample[] | undefined\n startedAt: number\n safeDur: number\n trackWidth: number\n scrolls: boolean\n}) {\n const { t } = useI18n()\n const has = !!samples && samples.length > 0\n const trend = useMemo(() => (has ? analyzeHeapTrend(samples!) : null), [samples, has])\n const paths = useMemo(\n () => (has ? buildHeapPaths(samples!, startedAt, safeDur) : null),\n [samples, has, startedAt, safeDur],\n )\n const color = trend ? HEAP_TREND_COLOR[trend.classification] : '#3b82f6'\n // The hint tooltip is taller than the (short) timeline scroll area, so an\n // absolutely-positioned box gets clipped by its overflow. Render it\n // position:fixed against the viewport instead (like the signal tooltip),\n // anchored to the icon and clamped/flipped to stay on screen.\n const [hintAnchor, setHintAnchor] = useState<{ left: number; top: number; bottom: number } | null>(\n null,\n )\n const hintRef = useRef<HTMLDivElement | null>(null)\n const [hintPos, setHintPos] = useState<{ left: number; top: number } | null>(null)\n\n useLayoutEffect(() => {\n if (!hintAnchor) {\n setHintPos(null)\n return\n }\n const el = hintRef.current\n if (!el) return\n const r = el.getBoundingClientRect()\n const vw = window.innerWidth\n const vh = window.innerHeight\n const gap = 6\n let left = hintAnchor.left\n if (left + r.width + 8 > vw) left = vw - r.width - 8\n if (left < 8) left = 8\n let top = hintAnchor.bottom + gap\n if (top + r.height + 8 > vh) top = hintAnchor.top - r.height - gap\n if (top < 8) top = 8\n setHintPos({ left, top })\n }, [hintAnchor])\n\n return (\n <div\n data-heap-strip=\"\"\n style={{\n display: 'flex',\n alignItems: 'stretch',\n height: `${HEAP_STRIP_H}px`,\n background: '#111',\n borderBottom: '1px solid #1c1c1c',\n }}\n >\n <div\n style={{\n flex: `0 0 ${LABEL_COL_WIDTH}px`,\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'sticky',\n left: 0,\n zIndex: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n gap: '2px',\n padding: '0 8px',\n borderRight: '1px solid #1c1c1c',\n background: '#0f0f0f',\n }}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '4px', color: '#9a9a9a' }}>\n {t.heapLabel}\n {has && (\n <span\n data-heap-hint=\"\"\n aria-label={t.heapExtensionHint}\n onMouseEnter={(e) => {\n const r = (e.currentTarget as HTMLElement).getBoundingClientRect()\n setHintAnchor({ left: r.left, top: r.top, bottom: r.bottom })\n }}\n onMouseLeave={() => setHintAnchor(null)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '12px',\n height: '12px',\n borderRadius: '50%',\n border: '1px solid #555',\n color: '#888',\n fontSize: '9px',\n lineHeight: 1,\n cursor: 'help',\n }}\n >\n i\n </span>\n )}\n </span>\n {has && trend && (\n <span data-heap-trend={trend.classification} style={{ color, fontSize: '10px' }}>\n {t.heapTrendLabel(trend.classification)}\n {trend.classification !== 'stable' &&\n ` · +${(trend.slopeBytesPerMin / (1024 * 1024)).toFixed(1)}MB/min`}\n </span>\n )}\n </div>\n <div\n style={{\n flex: scrolls ? '0 0 auto' : 1,\n width: scrolls ? `${trackWidth}px` : undefined,\n position: 'relative',\n padding: `0 ${TRACK_PAD_X}px`,\n }}\n >\n {has && paths ? (\n <Fragment>\n <svg\n width=\"100%\"\n height={HEAP_STRIP_H}\n viewBox={`0 0 ${HEAP_VB_W} ${HEAP_VB_H}`}\n preserveAspectRatio=\"none\"\n style={{ display: 'block' }}\n aria-hidden=\"true\"\n >\n <path d={paths.area} fill={color} fillOpacity={0.16} />\n <path d={paths.line} fill=\"none\" stroke={color} strokeWidth={1.2} vectorEffect=\"non-scaling-stroke\" />\n </svg>\n <span\n style={{\n position: 'absolute',\n top: '2px',\n right: '6px',\n color: '#666',\n fontSize: '10px',\n pointerEvents: 'none',\n }}\n >\n {formatBytes(paths.min)}–{formatBytes(paths.max)}\n </span>\n </Fragment>\n ) : (\n <span\n style={{\n position: 'absolute',\n top: '50%',\n left: '8px',\n transform: 'translateY(-50%)',\n color: '#666',\n fontSize: '10px',\n }}\n >\n {t.heapUnsupported}\n </span>\n )}\n </div>\n {hintAnchor && (\n <div\n ref={hintRef}\n role=\"tooltip\"\n style={{\n position: 'fixed',\n left: `${hintPos ? hintPos.left : 0}px`,\n top: `${hintPos ? hintPos.top : 0}px`,\n visibility: hintPos ? 'visible' : 'hidden',\n width: '220px',\n padding: '7px 9px',\n background: '#0d0d0d',\n border: '1px solid #2a2a2a',\n borderRadius: '6px',\n color: '#cfcfcf',\n fontSize: '10px',\n fontWeight: 400,\n lineHeight: 1.5,\n whiteSpace: 'normal',\n boxShadow: '0 4px 14px rgba(0,0,0,0.5)',\n zIndex: 2147483647,\n pointerEvents: 'none',\n }}\n >\n {t.heapExtensionHint}\n </div>\n )}\n </div>\n )\n}\n\nconst FPS_GOOD = '#34c759'\nconst FPS_OK = '#f59e0b'\nconst FPS_BAD = '#ef4444'\n\nfunction fpsColor(minFps: number): string {\n if (minFps >= 50) return FPS_GOOD\n if (minFps >= 30) return FPS_OK\n return FPS_BAD\n}\n\nfunction buildFpsPaths(\n series: { at: number; fps: number }[],\n startedAt: number,\n safeDur: number,\n): { area: string; line: string; max: number } | null {\n if (series.length === 0) return null\n let max = 60\n for (const s of series) if (s.fps > max) max = s.fps\n const pts = series.map((s) => {\n const x = Math.max(0, Math.min(HEAP_VB_W, ((s.at - startedAt) / safeDur) * HEAP_VB_W))\n const y = HEAP_VB_H - (Math.min(s.fps, max) / max) * HEAP_VB_H\n return { x, y }\n })\n // Points sit at bucket midpoints, so the series stops short of both edges.\n // Pin the ends to the track edges (flat-extending the first/last reading) so\n // the chart fills the full width like the heap strip.\n if (pts.length === 1) pts.push({ x: HEAP_VB_W, y: pts[0]!.y })\n pts[0]!.x = 0\n pts[pts.length - 1]!.x = HEAP_VB_W\n const line = pts.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(2)} ${p.y.toFixed(2)}`).join(' ')\n const last = pts[pts.length - 1]!\n const first = pts[0]!\n const area = `${line} L${last.x.toFixed(2)} ${HEAP_VB_H} L${first.x.toFixed(2)} ${HEAP_VB_H} Z`\n return { area, line, max }\n}\n\nfunction FpsStrip({\n frames,\n startedAt,\n safeDur,\n trackWidth,\n scrolls,\n}: {\n frames: number[] | undefined\n startedAt: number\n safeDur: number\n trackWidth: number\n scrolls: boolean\n}) {\n const { t } = useI18n()\n const has = !!frames && frames.length > 0\n const stats = useMemo(() => (has ? analyzeFrames(frames!) : null), [frames, has])\n const paths = useMemo(\n () => (stats ? buildFpsPaths(stats.series, startedAt, safeDur) : null),\n [stats, startedAt, safeDur],\n )\n const color = stats ? fpsColor(stats.minFps) : FPS_GOOD\n\n return (\n <div\n data-fps-strip=\"\"\n style={{\n display: 'flex',\n alignItems: 'stretch',\n height: `${HEAP_STRIP_H}px`,\n background: '#111',\n borderBottom: '1px solid #1c1c1c',\n }}\n >\n <div\n style={{\n flex: `0 0 ${LABEL_COL_WIDTH}px`,\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'sticky',\n left: 0,\n zIndex: 5,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n gap: '2px',\n padding: '0 8px',\n borderRight: '1px solid #1c1c1c',\n background: '#0f0f0f',\n }}\n >\n <span style={{ color: '#9a9a9a' }}>{t.fpsLabel}</span>\n {stats && (\n <span data-fps-min={Math.round(stats.minFps)} style={{ color, fontSize: '10px' }}>\n {t.fpsBadge(Math.round(stats.minFps), stats.droppedFrames)}\n </span>\n )}\n </div>\n <div\n style={{\n flex: scrolls ? '0 0 auto' : 1,\n width: scrolls ? `${trackWidth}px` : undefined,\n position: 'relative',\n padding: `0 ${TRACK_PAD_X}px`,\n }}\n >\n {stats && paths ? (\n <Fragment>\n <svg\n width=\"100%\"\n height={HEAP_STRIP_H}\n viewBox={`0 0 ${HEAP_VB_W} ${HEAP_VB_H}`}\n preserveAspectRatio=\"none\"\n style={{ display: 'block' }}\n aria-hidden=\"true\"\n >\n <path d={paths.area} fill={color} fillOpacity={0.16} />\n <path d={paths.line} fill=\"none\" stroke={color} strokeWidth={1.2} vectorEffect=\"non-scaling-stroke\" />\n </svg>\n <span\n style={{ position: 'absolute', top: '2px', right: '6px', color: '#666', fontSize: '10px', pointerEvents: 'none' }}\n >\n {t.fpsWorst(Math.round(stats.longestFrameMs))}\n </span>\n </Fragment>\n ) : (\n <span\n style={{ position: 'absolute', top: '50%', left: '8px', transform: 'translateY(-50%)', color: '#666', fontSize: '10px' }}\n >\n {t.fpsUnsupported}\n </span>\n )}\n </div>\n </div>\n )\n}\n\nexport function Timeline({ signals, duration, startedAt, heapSamples, frames, onJump }: TimelineProps) {\n const { t } = useI18n()\n const trackRef = useRef<HTMLDivElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const contentRef = useRef<HTMLDivElement | null>(null)\n // Cursor line left in px, measured from the track's real geometry so it\n // lands exactly on the bars (the label column's rendered width can differ\n // from LABEL_COL_WIDTH, so a hardcoded offset would drift).\n const [cursorLeftPx, setCursorLeftPx] = useState<number | null>(null)\n const [hovered, setHovered] = useState<{\n s: Signal\n clientX: number\n clientY: number\n count?: number\n members?: Signal[]\n } | null>(null)\n const [cursorFrac, setCursorFrac] = useState<number | null>(null)\n const tipRef = useRef<HTMLDivElement | null>(null)\n const [tipPos, setTipPos] = useState<{ left: number; top: number } | null>(null)\n // Visible track width (container minus the sticky label column). Drives\n // whether the recording fits or needs to scroll horizontally.\n const [viewportTrackWidth, setViewportTrackWidth] = useState(0)\n\n useLayoutEffect(() => {\n const el = containerRef.current\n if (!el) return\n const measure = () => setViewportTrackWidth(Math.max(0, el.clientWidth - LABEL_COL_WIDTH))\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(el)\n return () => ro.disconnect()\n }, [])\n\n // Position the tooltip after it renders so it never spills off-screen. The\n // panel commonly sits at the right edge, so anchoring a fixed nowrap tooltip\n // to the right of a bar would clip it. We measure the rendered tooltip, then\n // flip it to the left and clamp vertically as needed.\n useLayoutEffect(() => {\n if (!hovered) {\n setTipPos(null)\n return\n }\n const el = tipRef.current\n if (!el) return\n const r = el.getBoundingClientRect()\n const vw = window.innerWidth\n const vh = window.innerHeight\n const gap = 10\n let left = hovered.clientX + gap\n if (left + r.width + 8 > vw) left = hovered.clientX - r.width - gap\n if (left < 8) left = Math.max(8, Math.min(vw - r.width - 8, hovered.clientX - r.width / 2))\n let top = hovered.clientY - r.height - 6\n if (top < 8) top = hovered.clientY + 18\n if (top + r.height + 8 > vh) top = Math.max(8, vh - r.height - 8)\n setTipPos({ left, top })\n }, [hovered])\n\n const presentLanes = useMemo(\n () => LANE_ORDER.filter((k) => signals.some((s) => s.kind === k)),\n [signals],\n )\n\n // The axis spans the whole recording: 0 (start) to its full duration (stop).\n const winStart = 0\n const winEnd = Math.max(duration, 1)\n const safeDur = winEnd\n const ticks = useMemo(() => niceTicks(winStart, winEnd), [winStart, winEnd])\n\n // Grow the track to a fixed pixel width (and scroll) when fitting the whole\n // recording would drop below MIN_PX_PER_SEC; otherwise fit the viewport.\n const neededTrackWidth = (safeDur / 1000) * MIN_PX_PER_SEC\n const trackWidth = Math.max(viewportTrackWidth, neededTrackWidth)\n const scrolls = viewportTrackWidth > 0 && trackWidth > viewportTrackWidth + 0.5\n\n const hasHeap = !!heapSamples && heapSamples.length > 0\n const hasFrames = !!frames && frames.length > 0\n if (presentLanes.length === 0 && !hasHeap && !hasFrames) {\n return (\n <div style={{ color: '#888', padding: '20px', textAlign: 'center', fontSize: '11px' }}>\n {t.noTimeBound}\n </div>\n )\n }\n\n function handleMouseMove(e: MouseEvent) {\n const track = trackRef.current\n const content = contentRef.current\n if (!track || !content) return\n const rect = track.getBoundingClientRect()\n const inner = rect.width - 2 * TRACK_PAD_X\n const frac = Math.max(0, Math.min(1, (e.clientX - rect.left - TRACK_PAD_X) / inner))\n setCursorFrac(frac)\n // Cursor line lives inside the (possibly scrolled) content div, so measure\n // its left in content-local coordinates — scrolling shifts track and content\n // together, keeping this offset stable.\n const contLeft = content.getBoundingClientRect().left\n setCursorLeftPx(rect.left - contLeft + TRACK_PAD_X + inner * frac)\n }\n function handleMouseLeave() {\n setCursorFrac(null)\n setCursorLeftPx(null)\n setHovered(null)\n }\n\n const cursorTime = cursorFrac != null ? winStart + cursorFrac * safeDur : null\n\n return (\n <div\n style={{\n userSelect: 'none',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n }}\n >\n {/* Lane rows */}\n <div\n ref={containerRef}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n style={{\n position: 'relative',\n overflowX: scrolls ? 'auto' : 'visible',\n // overflow-x:auto forces overflow-y to auto too, which would clip the\n // cursor time label sitting at top:-14px — reserve that space.\n paddingTop: scrolls ? '14px' : 0,\n }}\n >\n <div\n ref={contentRef}\n style={{\n position: 'relative',\n width: scrolls ? `${LABEL_COL_WIDTH + trackWidth}px` : '100%',\n }}\n >\n {/* Cursor line — drawn across all lanes when hovering */}\n {cursorFrac != null && (\n <div\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: `${cursorLeftPx ?? 0}px`,\n width: '1px',\n background: '#3b82f680',\n pointerEvents: 'none',\n zIndex: 1,\n }}\n />\n )}\n {cursorFrac != null && cursorTime != null && (\n <div\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n top: '-14px',\n left: `${cursorLeftPx ?? 0}px`,\n transform:\n cursorFrac < 0.06\n ? 'translateX(0)'\n : cursorFrac > 0.94\n ? 'translateX(-100%)'\n : 'translateX(-50%)',\n fontSize: '10px',\n color: '#3b82f6',\n background: '#0d0d0d',\n padding: '0 4px',\n borderRadius: '3px',\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n zIndex: 2,\n }}\n >\n {formatTime(cursorTime)}\n </div>\n )}\n <HeapStrip\n samples={heapSamples}\n startedAt={startedAt}\n safeDur={safeDur}\n trackWidth={trackWidth}\n scrolls={scrolls}\n />\n <FpsStrip\n frames={frames}\n startedAt={startedAt}\n safeDur={safeDur}\n trackWidth={trackWidth}\n scrolls={scrolls}\n />\n {presentLanes.map((kind, li) => {\n const items = plotLane(signals, kind, winStart, winEnd, startedAt)\n const { bars, clusters } = clusterLane(items, CLUSTER_BIN_MS / safeDur)\n const altBg = li % 2 === 0 ? '#131313' : '#161616'\n // Network bars overlap (parallel requests), so pack them onto stacked\n // rows and grow the lane to fit. Other lanes keep the single-row layout.\n const isNet = kind === 'network'\n const trackInner = Math.max(1, trackWidth - 2 * TRACK_PAD_X)\n let laneBars = bars\n let barRows: number[] = []\n let laneHeight = LANE_HEIGHT\n if (isNet && bars.length > 0) {\n laneBars = [...bars].sort((a, b) => a.startFrac - b.startFrac)\n const packed = packRows(laneBars, trackInner)\n barRows = packed.rows\n laneHeight = Math.max(LANE_HEIGHT, packed.rowCount * (NET_BAR_H + NET_ROW_GAP) + NET_ROW_GAP)\n }\n return (\n <div\n key={kind}\n data-lane={kind}\n style={{\n display: 'flex',\n alignItems: 'stretch',\n height: `${laneHeight}px`,\n background: altBg,\n borderBottom: '1px solid #1c1c1c',\n }}\n >\n {/* Lane label — pinned left so the lane stays identifiable while\n the track scrolls horizontally. */}\n <div\n style={{\n flex: `0 0 ${LABEL_COL_WIDTH}px`,\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'sticky',\n left: 0,\n zIndex: 5,\n display: 'flex',\n alignItems: 'center',\n padding: '0 8px',\n color: '#9a9a9a',\n borderRight: '1px solid #1c1c1c',\n background: '#0f0f0f',\n }}\n >\n <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {t.kindLabel(kind)}\n </span>\n <span style={{ color: '#555', fontSize: '10px', marginLeft: '4px' }}>{items.length}</span>\n </div>\n\n {/* Track */}\n <div\n ref={li === 0 ? trackRef : undefined}\n style={{\n flex: scrolls ? '0 0 auto' : 1,\n width: scrolls ? `${trackWidth}px` : undefined,\n position: 'relative',\n padding: `0 ${TRACK_PAD_X}px`,\n }}\n >\n {/* Tick guide lines */}\n {ticks.map((t, ti) => {\n const leftPct = ((t - winStart) / safeDur) * 100\n return (\n <div\n key={`tg-${ti}`}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: `calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${leftPct / 100})`,\n width: '1px',\n background: '#1f1f1f',\n }}\n />\n )\n })}\n\n {/* Duration bars — wide enough to read as a real interval.\n Network bars sit on packed rows (waterfall); others span the\n lane vertically. */}\n {laneBars.map((p, i) => {\n const sev = severityForSignal(p.s)\n const color = SEVERITY_OVERLAY_COLOR[sev]\n const isHot = hovered?.s === p.s\n const baseOpacity = sev === 'low' ? 0.85 : sev === 'medium' ? 0.95 : 1\n const glow =\n sev === 'high' ? `0 0 8px ${color}cc, 0 0 0 1px ${color}` : `0 0 0 1px ${color}`\n const row = isNet ? (barRows[i] ?? 0) : 0\n const barTop = isNet ? `${NET_ROW_GAP + row * (NET_BAR_H + NET_ROW_GAP)}px` : '6px'\n // Stacked network bars often share a severity (same hue), so step\n // brightness per row to keep neighbours distinguishable without\n // losing the severity colour meaning.\n const netBrightness = isNet ? NET_ROW_BRIGHTNESS[row % NET_ROW_BRIGHTNESS.length]! : 1\n return (\n <div\n key={`bar-${kind}-${i}`}\n data-bar={kind}\n onMouseEnter={(e: MouseEvent) => {\n const r = (e.currentTarget as HTMLElement).getBoundingClientRect()\n setHovered({ s: p.s, clientX: r.left + r.width / 2, clientY: r.top })\n }}\n onMouseLeave={() => setHovered(null)}\n onClick={() => onJump?.(p.s)}\n title={formatTime((signalAbsoluteTime(p.s) ?? startedAt) - startedAt)}\n style={{\n position: 'absolute',\n top: barTop,\n bottom: isNet ? undefined : '6px',\n height: isNet ? `${NET_BAR_H}px` : undefined,\n left: `clamp(${TRACK_PAD_X}px, calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${p.startFrac.toFixed(4)}), calc(100% - ${MIN_BAR_W + TRACK_PAD_X}px))`,\n width: `min(calc(100% - ${2 * TRACK_PAD_X}px), max(${MIN_BAR_W}px, calc((100% - ${2 * TRACK_PAD_X}px) * ${p.widthFrac.toFixed(4)})))`,\n background: `linear-gradient(180deg, ${color}, ${color}cc)`,\n opacity: isHot ? 1 : baseOpacity,\n borderRadius: '3px',\n boxShadow: isHot ? `0 0 10px ${color}, 0 0 0 1px #fff6` : glow,\n cursor: onJump ? 'pointer' : 'default',\n transition: 'transform 90ms ease, box-shadow 90ms ease',\n transform: isHot ? 'scaleY(1.18)' : 'scaleY(1)',\n filter: isNet ? `brightness(${netBrightness})` : undefined,\n zIndex: isHot ? 3 : 2,\n }}\n />\n )\n })}\n\n {/* Point clusters — instant events, merged when they pile up.\n Marker grows with the count so a busy burst reads as one\n bigger dot, and a donut ring marks count > 1. */}\n {clusters.map((c, i) => {\n const color = SEVERITY_OVERLAY_COLOR[c.worst]\n const leftPct = c.startFrac * 100\n const isHot = hovered?.s === c.rep\n const baseOpacity = c.worst === 'low' ? 0.85 : c.worst === 'medium' ? 0.95 : 1\n const d = MARKER_D + Math.min(6, Math.log2(c.count) * 1.6)\n const glow =\n c.worst === 'high'\n ? `0 0 8px ${color}cc, 0 0 0 1px ${color}`\n : `0 0 0 1px ${color}`\n const ring = c.count > 1 ? `, inset 0 0 0 1.5px #0d0d0d` : ''\n const markerLeft = `clamp(${d / 2}px, calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${c.startFrac.toFixed(4)}), calc(100% - ${d / 2}px))`\n // Flip the count badge to the left of the dot near the right\n // edge so it never spills out of the track.\n const badgeFlip = c.startFrac > 0.85\n return (\n <Fragment key={`pt-${kind}-${i}`}>\n <div\n data-bar={kind}\n onMouseEnter={(e: MouseEvent) => {\n const r = (e.currentTarget as HTMLElement).getBoundingClientRect()\n setHovered({\n s: c.rep,\n clientX: r.left + r.width / 2,\n clientY: r.top,\n count: c.count,\n members: c.members,\n })\n }}\n onMouseLeave={() => setHovered(null)}\n onClick={() => onJump?.(c.rep)}\n title={formatTime((signalAbsoluteTime(c.rep) ?? startedAt) - startedAt)}\n style={{\n position: 'absolute',\n top: '50%',\n left: markerLeft,\n width: `${d}px`,\n height: `${d}px`,\n marginLeft: `-${d / 2}px`,\n transform: isHot ? 'translateY(-50%) scale(1.35)' : 'translateY(-50%)',\n background: color,\n opacity: isHot ? 1 : baseOpacity,\n borderRadius: '50%',\n boxShadow: (isHot ? `0 0 8px ${color}, 0 0 0 1px ${color}` : glow) + ring,\n cursor: onJump ? 'pointer' : 'default',\n transition: 'transform 90ms ease, box-shadow 90ms ease',\n zIndex: isHot ? 3 : 2,\n }}\n />\n {c.count > 1 && (\n <span\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n top: '50%',\n left: markerLeft,\n marginLeft: badgeFlip ? `-${d / 2 + 3}px` : `${d / 2 + 3}px`,\n transform: badgeFlip ? 'translate(-100%, -50%)' : 'translateY(-50%)',\n fontSize: '9px',\n fontWeight: 600,\n lineHeight: 1,\n color: '#e8e8e8',\n background: '#0d0d0dcc',\n padding: '1px 3px',\n borderRadius: '3px',\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n zIndex: isHot ? 4 : 3,\n }}\n >\n ×{c.count}\n </span>\n )}\n </Fragment>\n )\n })}\n </div>\n </div>\n )\n })}\n\n {/* Time axis */}\n <div\n style={{\n display: 'flex',\n height: `${AXIS_HEIGHT}px`,\n background: '#0f0f0f',\n color: '#666',\n fontSize: '10px',\n }}\n >\n <div\n style={{\n flex: `0 0 ${LABEL_COL_WIDTH}px`,\n minWidth: 0,\n boxSizing: 'border-box',\n position: 'sticky',\n left: 0,\n zIndex: 5,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n padding: '0 8px',\n borderRight: '1px solid #1c1c1c',\n background: '#0f0f0f',\n color: '#555',\n }}\n >\n {t.timeAxis}\n </div>\n <div\n style={{\n flex: scrolls ? '0 0 auto' : 1,\n width: scrolls ? `${trackWidth}px` : undefined,\n position: 'relative',\n padding: `0 ${TRACK_PAD_X}px`,\n }}\n >\n {ticks.map((t, ti) => {\n const leftPct = ((t - winStart) / safeDur) * 100\n const align =\n leftPct < 6 ? 'translateX(0)' : leftPct > 94 ? 'translateX(-100%)' : 'translateX(-50%)'\n return (\n <Fragment key={`tl-${ti}`}>\n <div\n style={{\n position: 'absolute',\n top: 0,\n height: '4px',\n width: '1px',\n background: '#444',\n left: `calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${leftPct / 100})`,\n }}\n />\n <div\n style={{\n position: 'absolute',\n top: '5px',\n left: `calc(${TRACK_PAD_X}px + (100% - ${2 * TRACK_PAD_X}px) * ${leftPct / 100})`,\n transform: align,\n whiteSpace: 'nowrap',\n }}\n >\n {formatTime(t)}\n </div>\n </Fragment>\n )\n })}\n </div>\n </div>\n </div>\n\n </div>\n\n {hovered && (\n <div\n ref={tipRef}\n role=\"tooltip\"\n style={{\n position: 'fixed',\n // Until measured, park at the origin (hidden) so the un-flipped\n // nowrap box can't overflow the viewport right edge and flash a\n // scrollbar. useLayoutEffect then flips/clamps and reveals it.\n left: `${tipPos ? tipPos.left : 0}px`,\n top: `${tipPos ? tipPos.top : 0}px`,\n visibility: tipPos ? 'visible' : 'hidden',\n background: '#0d0d0d',\n border: '1px solid #2a2a2a',\n borderRadius: '4px',\n padding: '4px 8px',\n fontSize: '11px',\n color: '#e6e6e6',\n pointerEvents: 'none',\n zIndex: 2147483647,\n whiteSpace: 'nowrap',\n boxShadow: '0 4px 12px rgba(0,0,0,0.5)',\n }}\n >\n {hovered.s.kind === 'render' && hovered.members && hovered.count && hovered.count > 1 ? (\n <RenderClusterTip\n members={hovered.members}\n count={hovered.count}\n s={hovered.s}\n startedAt={startedAt}\n />\n ) : (\n <Fragment>\n <TooltipContent s={hovered.s} startedAt={startedAt} />\n {hovered.count != null && hovered.count > 1 && (\n <span style={{ color: '#888', marginLeft: '6px' }}>×{hovered.count}</span>\n )}\n </Fragment>\n )}\n </div>\n )}\n </div>\n )\n}\n\nconst BREAKDOWN_MAX = 6\n\nfunction RenderClusterTip({\n members,\n count,\n s,\n startedAt,\n}: {\n members: Signal[]\n count: number\n s: Signal\n startedAt: number\n}) {\n const tAbs = signalAbsoluteTime(s)\n const at = tAbs == null ? '' : `@ ${formatTime(tAbs - startedAt)}`\n const bd = renderBreakdown(members)\n const shown = bd.slice(0, BREAKDOWN_MAX)\n const more = bd.length - shown.length\n return (\n <Fragment>\n <div>\n <strong>{count} renders</strong> <span style={{ color: '#888' }}>{at}</span>\n </div>\n <div style={{ color: '#9a9a9a', marginTop: '2px' }}>\n {shown.map((b, i) => (\n <span key={b.component}>\n {i > 0 ? ' · ' : ''}\n {b.component}\n {b.count > 1 ? ` ×${b.count}` : ''}\n </span>\n ))}\n {more > 0 ? ` · +${more}` : ''}\n </div>\n </Fragment>\n )\n}\n\nfunction TooltipContent({ s, startedAt }: { s: Signal; startedAt: number }) {\n const sev = severityForSignal(s)\n const color = SEVERITY_OVERLAY_COLOR[sev]\n const tAbs = signalAbsoluteTime(s)\n const t = tAbs == null ? null : tAbs - startedAt\n const at = t == null ? '' : `@ ${formatTime(t)}`\n switch (s.kind) {\n case 'long-task':\n return <span><strong>long-task</strong> <span style={{ color }}>{s.duration.toFixed(0)}ms</span> {at}</span>\n case 'forced-reflow':\n return <span><strong>forced-reflow</strong> <span style={{ color }}>{s.duration.toFixed(2)}ms</span>{(s.count ?? 1) > 1 ? ` ×${s.count}` : ''} {at}</span>\n case 'layout-shift':\n return <span><strong>layout-shift</strong> <span style={{ color }}>{s.value.toFixed(3)}</span> {at}</span>\n case 'render':\n return <span><strong>{s.component}</strong> <span style={{ color }}>{s.duration.toFixed(2)}ms</span> {at}</span>\n case 'network':\n return <span><strong>{s.url.slice(0, 40)}</strong> <span style={{ color }}>{s.duration.toFixed(0)}ms</span> {at}</span>\n case 'interaction':\n return <span><strong>{s.eventType}</strong> <span style={{ color }}>{s.duration.toFixed(0)}ms</span> {at}</span>\n case 'web-vital':\n return null\n }\n}\n","import type { LeakSuspect } from '@react-perfscope/core'\nimport { useI18n } from './i18n'\n\n/**\n * Compact list of suspected component leaks (components whose unmounted\n * instances stayed retained with a climbing count). Rendered in the timeline\n * tab alongside the heap strip; shows nothing when there are no suspects.\n */\nexport function LeakList({ suspects }: { suspects: LeakSuspect[] | undefined }) {\n const { t } = useI18n()\n if (!suspects || suspects.length === 0) return null\n return (\n <div data-leaks=\"\" style={{ padding: '8px 10px', borderBottom: '1px solid #1c1c1c' }}>\n <div\n style={{ display: 'flex', alignItems: 'center', gap: '6px', marginBottom: '6px' }}\n >\n <span style={{ color: '#ef4444', fontSize: '11px', fontWeight: 600 }}>{t.leaksTitle}</span>\n <span style={{ color: '#666', fontSize: '10px' }}>×{suspects.length}</span>\n </div>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {suspects.map((s) => (\n <li\n key={s.component}\n style={{ color: '#e6e6e6', fontSize: '11px', padding: '2px 0', fontVariantNumeric: 'tabular-nums' }}\n >\n {t.leakSuspect(s.component, s.retained, s.unmounted)}\n </li>\n ))}\n </ul>\n <p style={{ color: '#666', fontSize: '10px', margin: '6px 0 0', lineHeight: 1.4 }}>{t.leakHint}</p>\n </div>\n )\n}\n","import { h } from 'preact'\nimport type { RenderSignal } from '@react-perfscope/core'\nimport { severityForSignal, SEVERITY_COLOR } from './severity'\nimport { useI18n } from './i18n'\n\ninterface RenderInsightsProps {\n signals: RenderSignal[]\n onSelect?: (component: string) => void\n}\n\ninterface Aggregate {\n component: string\n count: number\n totalMs: number\n maxMs: number\n worstSeverity: 'low' | 'medium' | 'high'\n}\n\nfunction aggregate(signals: RenderSignal[]): Aggregate[] {\n const byName = new Map<string, RenderSignal[]>()\n for (const s of signals) {\n if (!byName.has(s.component)) byName.set(s.component, [])\n byName.get(s.component)!.push(s)\n }\n const result: Aggregate[] = []\n for (const [name, list] of byName) {\n let total = 0\n let max = 0\n let worst: 'low' | 'medium' | 'high' = 'low'\n for (const s of list) {\n total += s.duration\n if (s.duration > max) max = s.duration\n const sev = severityForSignal(s)\n if (sev === 'high' || (sev === 'medium' && worst === 'low')) worst = sev\n }\n result.push({ component: name, count: list.length, totalMs: total, maxMs: max, worstSeverity: worst })\n }\n result.sort((a, b) => b.totalMs - a.totalMs)\n return result\n}\n\nconst TOP_N = 5\n\nexport function RenderInsights({ signals, onSelect }: RenderInsightsProps) {\n const { t } = useI18n()\n if (signals.length === 0) return null\n const rows = aggregate(signals)\n const top = rows.slice(0, TOP_N)\n const max = top.length > 0 ? top[0]!.totalMs : 1\n const hiddenCount = rows.length - top.length\n\n return (\n <div\n style={{\n marginBottom: '8px',\n padding: '8px 10px',\n background: '#141414',\n border: '1px solid #1f1f1f',\n borderRadius: '8px',\n }}\n >\n <div style={{ fontSize: '10px', color: '#888', textTransform: 'uppercase', letterSpacing: '0.5px', marginBottom: '6px' }}>\n {t.topRenderers}\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n {top.map((a) => {\n const widthPct = max > 0 ? Math.max(2, (a.totalMs / max) * 100) : 0\n const color = SEVERITY_COLOR[a.worstSeverity]\n return (\n <div\n key={a.component}\n data-component={a.component}\n onClick={() => onSelect?.(a.component)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '11px',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n cursor: onSelect ? 'pointer' : 'default',\n padding: '3px 0',\n }}\n title={t.rendererDetail(a.component, a.count, a.totalMs, a.maxMs)}\n >\n <strong style={{ flex: '0 0 30%', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {a.component}\n </strong>\n <div style={{ flex: '1', position: 'relative', height: '14px', background: '#1f1f1f', borderRadius: '2px' }}>\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n height: '100%',\n width: `${widthPct}%`,\n background: color,\n opacity: a.worstSeverity === 'low' ? 0.4 : 0.7,\n borderRadius: '2px',\n }}\n />\n </div>\n <span style={{ flex: '0 0 auto', color, minWidth: '56px', textAlign: 'right' }}>\n {a.totalMs.toFixed(1)}ms\n </span>\n <span style={{ flex: '0 0 auto', color: '#888', minWidth: '32px', textAlign: 'right' }}>\n ×{a.count}\n </span>\n </div>\n )\n })}\n {hiddenCount > 0 && (\n <div style={{ fontSize: '10px', color: '#666', marginTop: '2px' }}>\n {t.moreComponents(hiddenCount)}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { h } from 'preact'\nimport { correlate } from '@react-perfscope/core'\nimport type { Signal, Episode, InpPhase } from '@react-perfscope/core'\nimport { useI18n } from './i18n'\nimport { EpisodeMemberList } from './episode-shared'\n\ntype PhaseLabelKey = 'inputDelay' | 'processingTime' | 'presentation'\n\nconst PHASES: { phase: InpPhase; labelKey: PhaseLabelKey }[] = [\n { phase: 'input-delay', labelKey: 'inputDelay' },\n { phase: 'processing', labelKey: 'processingTime' },\n { phase: 'presentation', labelKey: 'presentation' },\n]\n\n/** Picks the interaction-anchored episode with the longest latency — the\n * interaction that defines INP for this recording. */\nfunction worstInteractionEpisode(signals: Signal[]): Episode | null {\n let worst: Episode | null = null\n for (const ep of correlate(signals)) {\n if (ep.anchor.kind !== 'interaction') continue\n if (!worst || ep.anchor.duration > worst.anchor.duration) worst = ep\n }\n return worst\n}\n\nfunction phaseMs(episode: Episode, phase: InpPhase): number {\n const a = episode.anchor\n if (a.kind !== 'interaction') return 0\n return phase === 'input-delay' ? a.inputDelay : phase === 'processing' ? a.processing : a.presentation\n}\n\nexport function InpEpisode({ signals }: { signals: Signal[] }) {\n const { t } = useI18n()\n const episode = worstInteractionEpisode(signals)\n if (!episode || episode.anchor.kind !== 'interaction') return null\n const a = episode.anchor\n const target = a.target ? ` on ${a.target}` : ''\n\n return (\n <div\n data-inp-episode\n style={{\n margin: '0 0 8px',\n border: '1px solid #1f1f1f',\n borderRadius: '6px',\n background: '#121212',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n overflow: 'hidden',\n }}\n >\n <div style={{ padding: '6px 8px', borderBottom: '1px solid #1f1f1f', color: '#ddd' }}>\n <strong>{a.eventType}</strong>\n {target} — <strong>{Math.round(a.duration)}ms</strong>{' '}\n <span style={{ color: '#888' }}>INP</span>\n </div>\n {PHASES.map(({ phase, labelKey }) => {\n const members = episode.members.filter((m) => m.phase === phase)\n return (\n <div\n key={phase}\n data-inp-phase={phase}\n style={{ display: 'flex', gap: '8px', padding: '5px 8px', borderTop: '1px solid #1a1a1a' }}\n >\n <div style={{ flex: '0 0 92px', color: '#aaa' }}>\n {t[labelKey]}\n <div style={{ color: '#666', fontSize: '10px' }}>{Math.round(phaseMs(episode, phase))}ms</div>\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <EpisodeMemberList members={members} />\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import { h } from 'preact'\nimport type { EpisodeMember } from '@react-perfscope/core'\n\nexport function memberLabel(m: EpisodeMember): string {\n const s = m.signal\n if (s.kind === 'render') return `${s.component} (${s.reason})`\n if (s.kind === 'forced-reflow') {\n const top = s.stack[0]\n return top ? `forced reflow · ${top.file}:${top.line}` : 'forced reflow'\n }\n return `layout shift ${s.value.toFixed(3)}`\n}\n\n/** One cross-signal member of an episode: its label, the render commit that\n * caused it (when attributed), and a confidence badge. Shared by the\n * interaction (INP) and long-task episode views. */\nexport function EpisodeMemberRow({ member }: { member: EpisodeMember }) {\n return (\n <div\n data-member-kind={member.signal.kind}\n style={{ display: 'flex', alignItems: 'center', gap: '6px', padding: '1px 0', color: '#ccc' }}\n >\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {memberLabel(member)}\n </span>\n {member.causedBy && (\n <span style={{ flex: '0 0 auto', color: '#888' }}>← {member.causedBy.component}</span>\n )}\n {member.confidence === 'caused' && (\n <span\n style={{\n flex: '0 0 auto',\n fontSize: '9px',\n color: '#e0a030',\n border: '1px solid #5a4410',\n borderRadius: '3px',\n padding: '0 4px',\n }}\n >\n caused\n </span>\n )}\n </div>\n )\n}\n\nexport function EpisodeMemberList({ members }: { members: EpisodeMember[] }) {\n if (members.length === 0) return <span style={{ color: '#555' }}>—</span>\n return (\n <>\n {members.map((m, i) => (\n <EpisodeMemberRow key={i} member={m} />\n ))}\n </>\n )\n}\n","import { h } from 'preact'\nimport { correlate } from '@react-perfscope/core'\nimport type { Signal, Episode } from '@react-perfscope/core'\nimport { useI18n } from './i18n'\nimport { EpisodeMemberList } from './episode-shared'\n\n/** Picks the long-task-anchored episode with the longest duration — the worst\n * single block of main-thread time in the recording. */\nfunction worstLongTaskEpisode(signals: Signal[]): Episode | null {\n let worst: Episode | null = null\n for (const ep of correlate(signals)) {\n if (ep.anchor.kind !== 'long-task') continue\n if (!worst || ep.anchor.duration > worst.anchor.duration) worst = ep\n }\n return worst\n}\n\nexport function LongTaskEpisode({ signals }: { signals: Signal[] }) {\n const { t } = useI18n()\n const episode = worstLongTaskEpisode(signals)\n if (!episode || episode.anchor.kind !== 'long-task') return null\n // With no members there's nothing to correlate — the raw signal list below\n // already shows the task on its own, so skip the (empty) episode card.\n if (episode.members.length === 0) return null\n const a = episode.anchor\n\n return (\n <div\n data-long-task-episode\n style={{\n margin: '0 0 8px',\n border: '1px solid #1f1f1f',\n borderRadius: '6px',\n background: '#121212',\n fontFamily: 'SF Mono, Menlo, Consolas, monospace',\n fontSize: '11px',\n overflow: 'hidden',\n }}\n >\n <div style={{ padding: '6px 8px', borderBottom: '1px solid #1f1f1f', color: '#ddd' }}>\n <strong>{t.kindLabel('long-task')}</strong> — <strong>{Math.round(a.duration)}ms</strong>\n </div>\n <div style={{ padding: '5px 8px' }}>\n <EpisodeMemberList members={episode.members} />\n </div>\n </div>\n )\n}\n","import type { Signal } from '@react-perfscope/core'\n\n/**\n * Lowercased, human-readable text for a signal, used for substring filtering\n * in the panel. Covers the fields a developer would actually search by:\n * component names, request URLs, metric names, source functions/files.\n */\nexport function signalSearchText(signal: Signal): string {\n switch (signal.kind) {\n case 'render': {\n const parts = [signal.component]\n if (signal.changedProps) parts.push(...signal.changedProps)\n if (signal.members) for (const m of signal.members) parts.push(m.component)\n return parts.join(' ').toLowerCase()\n }\n case 'network':\n return signal.url.toLowerCase()\n case 'web-vital':\n return signal.name.toLowerCase()\n case 'interaction':\n return [signal.eventType, signal.target ?? ''].join(' ').toLowerCase()\n case 'forced-reflow': {\n const f = signal.stack[0]\n return f ? [f.fnName ?? '', f.file].join(' ').toLowerCase() : ''\n }\n case 'long-task': {\n const parts: string[] = []\n if (signal.scripts)\n for (const s of signal.scripts) parts.push(s.sourceFunctionName, s.invoker, s.sourceURL)\n if (signal.attribution)\n for (const a of signal.attribution) parts.push(a.frame.fnName ?? '', a.frame.file)\n return parts.join(' ').toLowerCase()\n }\n case 'layout-shift':\n return 'layout-shift'\n default:\n return ''\n }\n}\n\n/** Whether a signal matches a free-text filter query. Empty query matches all. */\nexport function signalMatchesFilter(signal: Signal, query: string): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return true\n return signalSearchText(signal).includes(q)\n}\n","import { h } from 'preact'\nimport { App } from './app'\nimport { mountShadow } from './shadow-mount'\nimport type { MountOptions, UnmountFn } from './types'\n\nexport function mount(opts: MountOptions): UnmountFn {\n const { recorder, position = 'bottom-right', host = document.body, resolveFrame, finalize } = opts\n return mountShadow(\n <App recorder={recorder} position={position} resolveFrame={resolveFrame} finalize={finalize} />,\n { parent: host }\n )\n}\n"],"mappings":"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","names":["useState","useRef","useEffect","useState","useMemo","useRef","h","jsx","jsxs","useMemo","useState","jsx","jsxs","useMemo","useState","t","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs","correlate","jsx","jsxs","correlate","Fragment","jsx","jsxs","POSITION_STYLES","WEB_VITAL_UNIT","useState","useMemo","useRef","key","jsx","jsxs","useState","useRef","useEffect","jsx"]}