@zylem/editor 0.7.4 → 0.8.8

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/web-components/zylem-editor.tsx","../../../../zylem-ui/src/layers/LayerContext.tsx","../../../../zylem-ui/src/layers/resolve-mount.ts","../../../../zylem-ui/src/layers/tiers.ts","../../../../zylem-ui/src/layers/dismiss-guard.ts","../../../../zylem-ui/src/components/Button/Button.tsx","../../../../zylem-ui/src/components/ToolbarButton/ToolbarButton.tsx","../../../../zylem-ui/src/components/TextField/TextField.tsx","../../../../zylem-ui/src/components/NumberField/NumberField.tsx","../../../../zylem-ui/src/components/Select/Select.tsx","../../../../zylem-ui/src/components/Checkbox/Checkbox.tsx","../../../../zylem-ui/src/components/Switch/Switch.tsx","../../../../zylem-ui/src/components/Slider/Slider.tsx","../../../../zylem-ui/src/components/Tabs/Tabs.tsx","../../../../zylem-ui/src/components/Accordion/Accordion.tsx","../../../../zylem-ui/src/components/Tooltip/Tooltip.tsx","../../../../zylem-ui/src/components/DropdownMenu/DropdownMenu.tsx","../../../../zylem-ui/src/components/Dialog/Dialog.tsx","../../../../zylem-ui/src/components/WindowControls/WindowControls.tsx","../../../../zylem-ui/src/components/Progress/Progress.tsx","../../../../zylem-ui/src/components/Separator/Separator.tsx","../../../../zylem-ui/src/components/TitleBar/TitleBar.tsx","../../../../zylem-ui/src/components/Panel/Panel.tsx","../../../../zylem-ui/src/components/Toolbar/Toolbar.tsx","../../../../zylem-ui/src/components/Property/Property.tsx","../../../../zylem-ui/src/components/Console/Console.tsx","../../../../zylem-ui/src/components/Sidebar/Sidebar.tsx","../../../../zylem-ui/src/components/Card/Card.tsx","../../../../zylem-ui/src/components/MenuButton/MenuButton.tsx","../../../../zylem-ui/src/components/ItemPicker/ItemPicker.tsx","../../../../zylem-ui/src/components/SearchInput/SearchInput.tsx","../../../../zylem-ui/src/components/ItemPicker/filter-items.ts","../../../../zylem-ui/src/components/EmptyState/EmptyState.tsx","../../../../zylem-ui/src/components/ScrollArea/ScrollArea.tsx","../src/components/Editor.tsx","../src/components/editor-panel/Menu.tsx","../src/components/toolbar/DeleteButton.tsx","../src/components/events.ts","../src/components/entities/entities-state.ts","../src/components/game/game-state.ts","../src/components/stages/stage-state.ts","../src/components/editor-store.ts","../src/components/common/dock-layout.ts","../src/components/EditorContext.tsx","../src/components/console/console-state.ts","../src/components/bridge/bridge-panel-state.ts","../src/bridge/editor-bridge.ts","../src/components/entities/thumbnail-store.ts","../src/components/toolbar/catalog-state.ts","../src/components/common/proxy-mirror.ts","../src/components/history/history-store.ts","../src/host/scene-operation-hook.ts","../src/components/toolbar/AddButton.tsx","../src/components/toolbar/add-button-state.ts","../src/components/toolbar/SelectButton.tsx","../src/components/toolbar/PlayPauseButton.tsx","../src/components/toolbar/DebugButton.tsx","../src/components/toolbar/GridButton.tsx","../src/components/transform/transform-state.ts","../src/components/toolbar/HistoryButtons.tsx","../src/components/toolbar/TransformButtons.tsx","../src/components/toolbar/transform-button-state.ts","../src/components/toolbar/Toolbar.tsx","../src/components/editor-panel/AccordionMenu.tsx","../src/components/game/GameSection.tsx","../src/components/stages/StageSection.tsx","../src/components/stages/stage-export.ts","../src/components/common/PropertyRow.tsx","../src/components/entities/EntitiesSection.tsx","../src/components/entities/EntityThumbnail.tsx","../src/components/entities/EntityIcon.tsx","../src/components/transform/TransformSection.tsx","../src/components/console/Console.tsx","../src/components/bridge/BridgePanel.tsx","../src/components/editor-panel/panel-config.tsx","../src/components/editor-panel/DraggableAccordionItem.tsx","../src/components/common/layer-ranks.ts","../src/components/EditorToggleButton.tsx","../src/components/common/FloatingPanel.tsx","../src/components/common/DockMenu.tsx","../src/components/common/panel-docking.tsx","../src/components/common/viewport.ts","../src/components/editor-panel/DetachedPanel.tsx","../src/App.tsx","raw-content:/Users/timothycool/Projects/zylem-projects/zylem-ui/dist/styles.css?raw","../src/components/entities/entity-preview.css.ts","../src/components/bridge/bridge-panel.css.ts","../src/components/toolbar/add-palette.css.ts","../src/components/history/history-shortcuts.ts","../src/components/toolbar/tool-shortcuts.ts","../src/components/toolbar/transform-tool-guard.ts","../src/components/common/Icon.tsx","../src/host/editor-host.ts"],"sourcesContent":["import { render } from 'solid-js/web';\nimport App, {\n type EditorController,\n type EditorLauncherMode,\n} from '../App';\nimport { EditorProvider } from '../components/EditorContext';\nimport { DOCK_SIDES, type DockPanelId, type DockSide } from '../components/common/dock-layout';\nimport type { EditorDockDefaults } from '../components/editor-store';\n\n// Import bundled CSS (single file with all tokens and component styles).\n// Resolves via the `./styles.css` export in `@zylem/ui/package.json`.\nimport zylemCSS from '@zylem/ui/styles.css?raw';\nimport { entityPreviewCSS } from '../components/entities/entity-preview.css';\nimport { bridgePanelCSS } from '../components/bridge/bridge-panel.css';\nimport { addPaletteCSS } from '../components/toolbar/add-palette.css';\nimport { connectEditorBridge } from '../bridge/editor-bridge';\nimport { installHistoryShortcuts } from '../components/history/history-shortcuts';\nimport { installToolShortcuts } from '../components/toolbar/tool-shortcuts';\nimport { installTransformToolGuard } from '../components/toolbar/transform-tool-guard';\nimport { connectTransformState } from '../components/transform/transform-state';\n\n/**\n * Configuration options for the ZylemEditorElement\n */\nexport interface ZylemEditorConfig {\n /**\n * External debug state to sync with.\n * If provided, the editor will use this state instead of its internal state.\n */\n debugState?: any;\n /**\n * External game state to sync with.\n */\n gameState?: any;\n /**\n * External stage state to sync with.\n */\n stageState?: any;\n /**\n * Whether to include default styles.\n * @default true\n */\n includeStyles?: boolean;\n /**\n * Controls whether the internal floating launcher is rendered.\n * @default 'floating'\n */\n launcherMode?: EditorLauncherMode;\n /**\n * Dock layout to seed the first time the editor runs in this browser, keyed\n * by viewport edge. Use `'main'` for the editor panel itself; any other id is\n * a section (for example `'console'`), which gets detached from the accordion\n * so it can hold a dock slot.\n *\n * Ignored once the user has a saved layout, so it sets a starting point\n * rather than forcing one.\n */\n defaultDocks?: EditorDockDefaults;\n /**\n * Whether the editor claims cmd/ctrl+z for its own undo stack.\n *\n * Disable it when embedding the editor in an app with its own history, and\n * call the exported `undo()` / `redo()` from that app's handler instead.\n * @default true\n */\n enableUndoShortcut?: boolean;\n /**\n * Whether Escape disarms the active tool.\n * @default true\n */\n enableEscapeShortcut?: boolean;\n}\n\nconst normalizeLauncherMode = (value: unknown): EditorLauncherMode =>\n value === 'hidden' ? 'hidden' : 'floating';\n\n/** Tolerant parse so a malformed attribute degrades to \"no defaults\". */\nconst normalizeDockDefaults = (value: unknown): EditorDockDefaults | undefined => {\n let source = value;\n if (typeof source === 'string') {\n try {\n source = JSON.parse(source);\n } catch {\n return undefined;\n }\n }\n if (!source || typeof source !== 'object') return undefined;\n\n const defaults: EditorDockDefaults = {};\n for (const side of DOCK_SIDES) {\n const panels = (source as Record<string, unknown>)[side];\n if (!Array.isArray(panels)) continue;\n const ids = panels.filter(\n (id): id is DockPanelId => typeof id === 'string' && id.length > 0,\n );\n if (ids.length > 0) defaults[side] = ids;\n }\n\n return Object.keys(defaults).length > 0 ? defaults : undefined;\n};\n\n/**\n * ZylemEditorElement - A web component that wraps the Zylem Editor.\n * \n * This component is fully self-contained with bundled styles.\n * It can be imported and used in any project without additional CSS configuration.\n * \n * @example\n * ```html\n * <!-- Standalone usage -->\n * <zylem-editor></zylem-editor>\n * ```\n * \n * @example\n * ```js\n * // Configured usage\n * const editor = document.querySelector('zylem-editor');\n * editor.config = {\n * debugState: myGame.debugState,\n * gameState: myGame.gameState,\n * stageState: myGame.stageState,\n * };\n * ```\n * \n * @example\n * ```js\n * // Manual registration in another project\n * import { ZylemEditorElement } from '@zylem/editor';\n * \n * // Optionally customize before registering\n * customElements.define('my-editor', ZylemEditorElement);\n * ```\n */\nexport class ZylemEditorElement extends HTMLElement {\n private dispose: (() => void) | null = null;\n private _config: ZylemEditorConfig = {};\n private _initialized = false;\n private controller: EditorController | null = null;\n /** Releases this element's bridge subscription (reference-counted). */\n private releaseBridge: (() => void) | null = null;\n /** Keyboard shortcuts and the snap/grid mirror, torn down with the element. */\n private teardownHooks: (() => void)[] = [];\n\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n\n /**\n * Set configuration for the editor.\n * Must be set before the element is connected to the DOM, or call `reinitialize()` after.\n */\n set config(value: ZylemEditorConfig) {\n this._config = value;\n if (this._initialized) {\n this.reinitialize();\n }\n }\n\n get config(): ZylemEditorConfig {\n return this._config;\n }\n\n set launcherMode(value: EditorLauncherMode) {\n const normalized = normalizeLauncherMode(value);\n if (this._config.launcherMode === normalized) {\n return;\n }\n\n this._config.launcherMode = normalized;\n if (this._initialized) {\n this.reinitialize();\n }\n }\n\n get launcherMode(): EditorLauncherMode {\n return normalizeLauncherMode(this._config.launcherMode);\n }\n\n /**\n * Observed attributes for the web component\n */\n static get observedAttributes() {\n return ['include-styles', 'launcher-mode', 'default-docks'];\n }\n\n attributeChangedCallback(name: string, _oldValue: string, newValue: string) {\n if (name === 'include-styles') {\n this._config.includeStyles = newValue !== 'false';\n return;\n }\n\n if (name === 'launcher-mode') {\n this.launcherMode = normalizeLauncherMode(newValue);\n return;\n }\n\n if (name === 'default-docks') {\n // Only consulted on first run, so a late change needs no reinitialize.\n const defaults = normalizeDockDefaults(newValue);\n if (defaults) {\n this._config.defaultDocks = defaults;\n } else {\n delete this._config.defaultDocks;\n }\n }\n }\n\n connectedCallback() {\n this.initialize();\n }\n\n private initialize() {\n if (this._initialized) return;\n this._initialized = true;\n\n // Subscribing here rather than at module load means a game with no editor\n // mounted publishes nothing, and the game can skip editor-only work.\n this.releaseBridge = connectEditorBridge();\n\n this.teardownHooks = [\n // Pushes the editor's snap increments and grid visibility to the game, so\n // the gizmo snaps to whatever the toolbar shows.\n connectTransformState(),\n installHistoryShortcuts({ enabled: this._config.enableUndoShortcut !== false }),\n installToolShortcuts({ enabled: this._config.enableEscapeShortcut !== false }),\n // The gizmo mode buttons hide with the selection, so an active tool has to\n // be released with it or it becomes unreachable.\n installTransformToolGuard(),\n ];\n\n // Add bundled styles unless explicitly disabled\n if (this._config.includeStyles !== false) {\n const styleElement = document.createElement('style');\n\n styleElement.textContent = `${zylemCSS}\\n${entityPreviewCSS}\\n${bridgePanelCSS}\\n${addPaletteCSS}`;\n this.shadowRoot!.appendChild(styleElement);\n }\n\n const div = document.createElement('div');\n div.style.width = '100%';\n div.style.height = '100%';\n this.shadowRoot!.appendChild(div);\n\n this.dispose = render(() => (\n <EditorProvider>\n <App\n launcherMode={this.launcherMode}\n defaultDocks={normalizeDockDefaults(this._config.defaultDocks)}\n onControllerReady={(controller) => {\n this.controller = controller;\n }}\n />\n </EditorProvider>\n ), div);\n }\n\n openPanel() {\n this.controller?.openPanel();\n }\n\n closePanel() {\n this.controller?.closePanel();\n }\n\n togglePanel() {\n this.controller?.togglePanel();\n }\n\n /**\n * Dock a panel to a viewport edge, or pass `null` to float it again.\n * Defaults to the main editor panel.\n */\n dockPanel(side: DockSide | null, panelId?: DockPanelId) {\n this.controller?.dockPanel(side, panelId);\n }\n\n /**\n * Reinitialize the editor with new configuration.\n * Call this after changing the `config` property if the element is already connected.\n */\n reinitialize() {\n this.teardown();\n // Clear shadow root\n while (this.shadowRoot!.firstChild) {\n this.shadowRoot!.removeChild(this.shadowRoot!.firstChild);\n }\n this.initialize();\n }\n\n disconnectedCallback() {\n this.teardown();\n }\n\n private teardown() {\n if (this.dispose) {\n this.dispose();\n this.dispose = null;\n }\n for (const teardown of this.teardownHooks) teardown();\n this.teardownHooks = [];\n this.releaseBridge?.();\n this.releaseBridge = null;\n this.controller = null;\n this._initialized = false;\n }\n}\n\n/**\n * Register the ZylemEditorElement as a custom element.\n * Call this function to use the default 'zylem-editor' tag name.\n * \n * @example\n * ```js\n * import { registerZylemEditor } from '@zylem/editor';\n * registerZylemEditor();\n * // Now you can use <zylem-editor> in your HTML\n * ```\n */\nexport function registerZylemEditor(tagName = 'zylem-editor') {\n if (!customElements.get(tagName)) {\n customElements.define(tagName, ZylemEditorElement);\n }\n}\n\n// Auto-register with default tag name for convenience\nif (typeof window !== 'undefined' && !customElements.get('zylem-editor')) {\n customElements.define('zylem-editor', ZylemEditorElement);\n}\n","import {\n\tcreateContext,\n\tcreateMemo,\n\tcreateSignal,\n\tonMount,\n\tuseContext,\n\ttype Accessor,\n\ttype JSX,\n} from 'solid-js';\nimport { ensureLayerContainer, LAYER_PORTAL_CLASS } from './resolve-mount';\nimport { layerTierVars, type LayerTier } from './tiers';\n\nexport type { LayerTier };\n\ninterface LayerContextValue {\n\tcontainer: Accessor<HTMLElement | undefined>;\n}\n\nconst LayerCtx = createContext<LayerContextValue>();\n\nexport interface LayerProviderProps {\n\tchildren: JSX.Element;\n}\n\n/**\n * Root of the layer system: resolves the tree the app lives in — shadow root or\n * document — and owns the container overlays portal into.\n *\n * Optional. `useLayer` resolves a container by itself when no provider is\n * mounted, so a page with one `Tooltip` needs no setup. It earns its keep when an\n * app spans several trees, such as two web components on one page, by pinning\n * each subtree to the container in its own tree.\n */\nexport function LayerProvider(props: LayerProviderProps) {\n\tconst [container, setContainer] = createSignal<HTMLElement>();\n\tlet markerRef: HTMLSpanElement | undefined;\n\n\t// Deferred to mount so `getRootNode()` can see an enclosing shadow root.\n\tonMount(() => setContainer(ensureLayerContainer(markerRef)));\n\n\treturn (\n\t\t<LayerCtx.Provider value={{ container }}>\n\t\t\t<span ref={markerRef} style={{ display: 'none' }} aria-hidden=\"true\" />\n\t\t\t{props.children}\n\t\t</LayerCtx.Provider>\n\t);\n}\n\nexport interface LayerScopeProps {\n children: JSX.Element;\n class?: string | undefined;\n style?: JSX.CSSProperties | undefined;\n}\n\n/**\n * A subtree that layers independently of the rest of the page.\n *\n * Two things make that work: the scope is a stacking context, so its\n * descendants' `z-index` values are only compared with each other and none of\n * them can paint above anything outside; and the scope owns the portal container\n * its descendants mount into, so overlays opened inside it stay inside it.\n *\n * A dialog wraps its content in one, so a tooltip opened within the dialog floats\n * over the dialog body without also floating over a menu belonging to the page.\n */\nexport function LayerScope(props: LayerScopeProps) {\n\tconst [container, setContainer] = createSignal<HTMLElement>();\n\n\treturn (\n\t\t<div\n\t\t\tclass={props.class ? `zylem-layer-scope ${props.class}` : 'zylem-layer-scope'}\n\t\t\tstyle={props.style}\n\t\t>\n\t\t\t<LayerCtx.Provider value={{ container }}>{props.children}</LayerCtx.Provider>\n\t\t\t<div class={LAYER_PORTAL_CLASS} ref={setContainer} />\n\t\t</div>\n\t);\n}\n\nexport interface ResolvedLayer {\n\t/** Where to portal. `undefined` until mounted, so callers gate on it. */\n\tmount: Accessor<HTMLElement | undefined>;\n\t/** Value for the overlay's `z-index`. */\n\tzIndex: Accessor<string>;\n\t/**\n\t * Attach to any element inside the component. Lets the tree be resolved\n\t * without a `LayerProvider`, which is what keeps overlays styled inside a\n\t * shadow root. Ignored when a provider is present.\n\t */\n\tanchorRef: (element: Element) => void;\n}\n\n/**\n * Resolve a tier to a portal target and a `z-index`.\n *\n * @param rank Offset within the tier, for ordering peers — raising a clicked\n * window above its siblings, say. Bands are 1000 apart, so ranks below that stay\n * inside their tier. The offset means the same thing inside a `LayerScope` as\n * out, so a panel can be lifted above a scope's tooltips while staying under its\n * menus.\n */\nexport function useLayer(\n\ttier: LayerTier,\n\trank: Accessor<number> | number = 0,\n): ResolvedLayer {\n\tconst context = useContext(LayerCtx);\n\tconst [fallback, setFallback] = createSignal<HTMLElement>();\n\tlet anchor: Element | undefined;\n\n\tif (!context) {\n\t\t// Runs after the ref below has been assigned and the element is in the\n\t\t// document, which `getRootNode()` needs. With no anchor attached this\n\t\t// still resolves, just to the document body.\n\t\tonMount(() => setFallback(ensureLayerContainer(anchor)));\n\t}\n\n\tconst zIndex = createMemo(() => {\n\t\tconst offset = typeof rank === 'function' ? rank() : rank;\n\t\tconst token = layerTierVars[tier];\n\t\t// Left as a `calc` over the custom property rather than resolved here, so\n\t\t// the cascade stays in charge of the tier's actual value.\n\t\treturn offset ? `calc(${token} + ${offset})` : token;\n\t});\n\n\treturn {\n\t\tmount: context ? context.container : fallback,\n\t\tzIndex,\n\t\tanchorRef: (element: Element) => {\n\t\t\tanchor = element;\n\t\t},\n\t};\n}\n","/**\n * Where a portaled overlay should mount.\n *\n * Kobalte's portals default to `document.body`, which breaks inside a shadow\n * root: the styles a web component injects into its own shadow tree do not apply\n * to `document.body`, so the overlay renders unstyled. Resolving from the\n * triggering element instead keeps the overlay in whatever tree its styles live\n * in.\n */\n\n/** Class on the container that layered overlays mount into. */\nexport const LAYER_PORTAL_CLASS = 'zylem-layer-portals';\n\n/**\n * The shadow root or document body that owns `node`.\n *\n * Must be called after the node is in the document — `getRootNode()` only sees\n * the shadow root once the subtree has been inserted.\n */\nexport function resolveLayerRoot(\n\tnode: Node | null | undefined,\n): ShadowRoot | HTMLElement {\n\tconst root = node?.getRootNode();\n\tif (root instanceof ShadowRoot) return root;\n\tif (root instanceof Document) return root.body;\n\treturn document.body;\n}\n\n/**\n * The portal container for `node`'s tree, creating it on first use.\n *\n * Appended last so it starts above its siblings in paint order even before\n * z-index is considered, and reused across every overlay in the same tree so a\n * page with many menus does not accumulate containers.\n */\nexport function ensureLayerContainer(node: Node | null | undefined): HTMLElement {\n\tconst root = resolveLayerRoot(node);\n\tfor (const child of Array.from(root.children)) {\n\t\tif (child instanceof HTMLElement && child.classList.contains(LAYER_PORTAL_CLASS)) {\n\t\t\treturn child;\n\t\t}\n\t}\n\n\tconst container = document.createElement('div');\n\tcontainer.className = LAYER_PORTAL_CLASS;\n\troot.appendChild(container);\n\treturn container;\n}\n","/**\n * The layer tier ladder, as plain TypeScript.\n *\n * These live outside `theme.css.ts` because the runtime half of the layer\n * system (`useLayer`) needs them, and `@zylem/ui/components` ships as source to\n * consumers that do not compile vanilla-extract. A `.tsx` importing a `.css.ts`\n * would drag `createGlobalTheme` into those apps, where it throws for want of a\n * file scope. The theme imports these instead, so the ladder is still declared\n * once.\n */\n\n/**\n * Stacking tiers, lowest first. Every overlay reads its `z-index` from one of\n * these rather than picking a number, so the order is decided in one place.\n */\nexport type LayerTier = 'base' | 'panel' | 'modal' | 'popover' | 'tooltip' | 'menu';\n\n/**\n * The `z-index` each tier resolves to. Fed to the theme as `tokens.layers`.\n *\n * Bands are 1000 apart to leave room for a per-instance rank offset, which is\n * what dynamic ordering within a tier needs (raising the clicked window to the\n * front of the other windows, say).\n */\nexport const layerTierValues = {\n\tbase: '0',\n\tpanel: '1000',\n\tmodal: '2000',\n\tpopover: '3000',\n\ttooltip: '4000',\n\tmenu: '5000',\n} as const;\n\n/**\n * Custom-property name per tier, sans the leading `--`. Fed to the theme as\n * `varNames.layers`, and must stay in lock-step with {@link layerTierValues}.\n */\nexport const layerTierVarNames = {\n\tbase: 'zylem-layer-base',\n\tpanel: 'zylem-layer-panel',\n\tmodal: 'zylem-layer-modal',\n\tpopover: 'zylem-layer-popover',\n\ttooltip: 'zylem-layer-tooltip',\n\tmenu: 'zylem-layer-menu',\n} as const;\n\n/**\n * `var(--zylem-layer-*)` reference per tier — the same strings `vars.layers`\n * carries, reachable without loading the theme's `.css.ts`.\n */\nexport const layerTierVars = Object.fromEntries(\n\tObject.entries(layerTierVarNames).map(([tier, name]) => [tier, `var(--${name})`])\n) as Record<LayerTier, string>;\n","/**\n * Keeps a dismissable overlay open when the interaction that \"left\" it never did.\n *\n * Kobalte decides an interaction is outside a layer by reading `event.target` in a\n * capture-phase listener on `document`. Inside a shadow root that target has been\n * retargeted to the host element, so the check asks whether the panel contains the\n * whole web component — which it never does. Every pointerdown in the tree then\n * reads as an outside click and the overlay closes on pointerdown, before the\n * click can reach whatever was pressed. The same listener serves `focusin`, so\n * focusing a field inside the panel closes it too.\n *\n * The original event survives on the dismissal event's `detail`, and its\n * `composedPath()` still crosses the shadow boundary, so it can name the element\n * actually pressed. Preventing the event cancels only the dismissal — a genuine\n * outside interaction is left alone and still closes the overlay.\n */\n\n/**\n * The shape of Kobalte's interact-outside events.\n *\n * Declared structurally rather than imported: the type is not re-exported from\n * `@kobalte/core`'s entry point, and reaching into the package's internals to\n * borrow it would tie this to their file layout.\n */\nexport interface DismissalEvent {\n\tdetail: { originalEvent: Event };\n\tpreventDefault: () => void;\n}\n\nexport interface DismissGuard {\n\t/** Attach to the overlay's content element. */\n\tref: (element: HTMLElement) => void;\n\t/** Pass to the content's `onInteractOutside`. */\n\tonInteractOutside: (event: DismissalEvent) => void;\n}\n\n/** Whether a finished event's coordinates fall within `content`. */\nfunction hitByPoint(event: Event, content: HTMLElement): boolean {\n\tif (!('clientX' in event) || !('clientY' in event)) return false;\n\tconst { clientX, clientY } = event as MouseEvent;\n\n\tconst rect = content.getBoundingClientRect();\n\treturn (\n\t\tclientX >= rect.left\n\t\t&& clientX <= rect.right\n\t\t&& clientY >= rect.top\n\t\t&& clientY <= rect.bottom\n\t);\n}\n\nfunction isInside(original: Event, content: HTMLElement): boolean {\n\tconst path = original.composedPath();\n\tif (path.length > 0) return path.includes(content);\n\n\t// Touch takes a slower road: Kobalte defers the check to the following\n\t// `click`, by which point the pointerdown has finished dispatching and its\n\t// composed path has been emptied. Geometry is what is left to go on.\n\treturn hitByPoint(original, content);\n}\n\n/**\n * Guard one overlay.\n *\n * Per-overlay rather than global because the answer depends on which content\n * element is asking: a menu nested inside a dialog has to be able to dismiss\n * without also dismissing the dialog around it.\n */\nexport function createDismissGuard(): DismissGuard {\n\tlet content: HTMLElement | undefined;\n\n\treturn {\n\t\tref: (element: HTMLElement) => {\n\t\t\tcontent = element;\n\t\t},\n\t\tonInteractOutside: (event: DismissalEvent) => {\n\t\t\tif (!content) return;\n\t\t\tif (!isInside(event.detail.originalEvent, content)) return;\n\t\t\tevent.preventDefault();\n\t\t},\n\t};\n}\n","import type { JSX } from 'solid-js';\nimport { splitProps } from 'solid-js';\n\nexport type ButtonVariant = 'default' | 'primary' | 'active' | 'danger' | 'ghost';\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'icon';\n\nexport interface ButtonProps\n extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n}\n\n/**\n * HyperGlass button: squared Aqua-like bevel with glass depth. Variants map\n * to the Zylem palette — `active` for live/run actions, `danger` for\n * destructive actions, `ghost` for low-emphasis chrome.\n *\n * Styling lives on the global `.zylem-button` class (bundled in\n * `@zylem/ui/styles.css`), selected via `data-variant` / `data-size`.\n */\nexport function Button(props: ButtonProps) {\n const [local, rest] = splitProps(props, ['variant', 'size', 'class', 'children']);\n return (\n <button\n type=\"button\"\n class={local.class ? `zylem-button ${local.class}` : 'zylem-button'}\n data-variant={local.variant ?? 'default'}\n data-size={local.size ?? 'md'}\n {...rest}\n >\n {local.children}\n </button>\n );\n}\n","import { Button as KButton, Tooltip as KTooltip } from '@kobalte/core';\nimport { Show, type JSX } from 'solid-js';\nimport { useLayer } from '../../layers';\n\nexport interface ToolbarButtonProps {\n label: string;\n onClick?: (event: MouseEvent) => void;\n selected?: boolean;\n disabled?: boolean;\n children: JSX.Element;\n class?: string;\n}\n\n/**\n * HyperGlass toolbar button: square glass icon button with a tooltip.\n * Selected state renders as a live-green jewel.\n *\n * The tooltip portals into the layer container for its own tree, so it stays\n * styled when the toolbar lives inside a web component's shadow root.\n */\nexport function ToolbarButton(props: ToolbarButtonProps) {\n const layer = useLayer('tooltip');\n\n return (\n <KTooltip.Root openDelay={400}>\n <KTooltip.Trigger as=\"span\" ref={layer.anchorRef}>\n <KButton.Root\n aria-label={props.label}\n onClick={props.onClick}\n disabled={props.disabled}\n class={\n props.class\n ? `zylem-toolbar-btn ${props.class}`\n : 'zylem-toolbar-btn'\n }\n data-selected={props.selected ? '' : undefined}\n >\n {props.children}\n </KButton.Root>\n </KTooltip.Trigger>\n <Show when={layer.mount()} keyed>\n {(mount) => (\n <KTooltip.Portal mount={mount}>\n <KTooltip.Content class=\"zylem-tooltip\">\n {props.label}\n </KTooltip.Content>\n </KTooltip.Portal>\n )}\n </Show>\n </KTooltip.Root>\n );\n}\n","import { TextField as KTextField } from '@kobalte/core';\nimport { Show, splitProps } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface TextFieldProps {\n label?: string;\n error?: string;\n placeholder?: string;\n value?: string;\n onChange?: (value: string) => void;\n onInput?: JSX.EventHandlerUnion<HTMLInputElement | HTMLTextAreaElement, InputEvent>;\n type?: string;\n name?: string;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n multiline?: boolean;\n rows?: number;\n class?: string;\n autofocus?: boolean;\n onKeyDown?: JSX.EventHandlerUnion<HTMLInputElement | HTMLTextAreaElement, KeyboardEvent>;\n}\n\n/**\n * HyperGlass text field: inset glass input with an uppercase HyperCard-style\n * label. Set `multiline` for a textarea.\n */\nexport function TextField(props: TextFieldProps) {\n const [local] = splitProps(props, ['label', 'error', 'multiline', 'class']);\n\n return (\n <KTextField.Root\n class={local.class ? `zylem-field-root ${local.class}` : 'zylem-field-root'}\n value={props.value}\n onChange={props.onChange}\n name={props.name}\n disabled={props.disabled}\n readOnly={props.readOnly}\n required={props.required}\n validationState={local.error ? 'invalid' : 'valid'}\n >\n <Show when={local.label}>\n <KTextField.Label class=\"zylem-field-label\">\n {local.label}\n </KTextField.Label>\n </Show>\n <Show\n when={local.multiline}\n fallback={\n <KTextField.Input\n class=\"zylem-field zylem-textfield-input\"\n type={props.type ?? 'text'}\n placeholder={props.placeholder}\n autofocus={props.autofocus}\n onInput={props.onInput as JSX.EventHandlerUnion<HTMLInputElement, InputEvent>}\n onKeyDown={props.onKeyDown as JSX.EventHandlerUnion<HTMLInputElement, KeyboardEvent>}\n />\n }\n >\n <KTextField.TextArea\n class=\"zylem-field zylem-textfield-textarea\"\n placeholder={props.placeholder}\n rows={props.rows}\n autofocus={props.autofocus}\n onInput={props.onInput as JSX.EventHandlerUnion<HTMLTextAreaElement, InputEvent>}\n onKeyDown={props.onKeyDown as JSX.EventHandlerUnion<HTMLTextAreaElement, KeyboardEvent>}\n />\n </Show>\n <Show when={local.error}>\n <KTextField.ErrorMessage class=\"zylem-field-error\">\n {local.error}\n </KTextField.ErrorMessage>\n </Show>\n </KTextField.Root>\n );\n}\n","import { NumberField as KNumberField } from '@kobalte/core';\nimport { Show } from 'solid-js';\n\nexport interface NumberFieldProps {\n label?: string;\n error?: string;\n value?: number;\n onChange?: (value: number) => void;\n minValue?: number;\n maxValue?: number;\n step?: number;\n disabled?: boolean;\n placeholder?: string;\n name?: string;\n class?: string;\n}\n\n/**\n * HyperGlass number field: inset glass input with square jewel steppers.\n */\nexport function NumberField(props: NumberFieldProps) {\n return (\n <KNumberField.Root\n class={props.class ? `zylem-field-root ${props.class}` : 'zylem-field-root'}\n rawValue={props.value}\n onRawValueChange={(value) => {\n if (props.onChange && !Number.isNaN(value)) props.onChange(value);\n }}\n minValue={props.minValue}\n maxValue={props.maxValue}\n step={props.step}\n disabled={props.disabled}\n name={props.name}\n validationState={props.error ? 'invalid' : 'valid'}\n >\n <Show when={props.label}>\n <KNumberField.Label class=\"zylem-field-label\">\n {props.label}\n </KNumberField.Label>\n </Show>\n <div class=\"zylem-numberfield-group\">\n <KNumberField.Input\n class=\"zylem-field zylem-numberfield-input\"\n placeholder={props.placeholder}\n />\n <KNumberField.IncrementTrigger\n class=\"zylem-numberfield-stepper zylem-numberfield-stepper--up\"\n aria-label=\"Increment\"\n >\n ▲\n </KNumberField.IncrementTrigger>\n <KNumberField.DecrementTrigger\n class=\"zylem-numberfield-stepper zylem-numberfield-stepper--down\"\n aria-label=\"Decrement\"\n >\n ▼\n </KNumberField.DecrementTrigger>\n </div>\n <Show when={props.error}>\n <KNumberField.ErrorMessage class=\"zylem-field-error\">\n {props.error}\n </KNumberField.ErrorMessage>\n </Show>\n </KNumberField.Root>\n );\n}\n","import { Select as KSelect } from '@kobalte/core';\nimport { Show } from 'solid-js';\nimport { createDismissGuard, useLayer } from '../../layers';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n options: SelectOption[];\n value?: string;\n onChange?: (value: string | null) => void;\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n name?: string;\n class?: string;\n}\n\n/**\n * HyperGlass select: inset glass trigger opening a floating glass sheet.\n */\nexport function Select(props: SelectProps) {\n const layer = useLayer('menu');\n const dismiss = createDismissGuard();\n const selected = () =>\n props.options.find((option) => option.value === props.value) ?? null;\n\n return (\n <KSelect.Root<SelectOption>\n class={props.class ? `zylem-field-root ${props.class}` : 'zylem-field-root'}\n options={props.options}\n optionValue=\"value\"\n optionTextValue=\"label\"\n optionDisabled=\"disabled\"\n value={selected()}\n onChange={(option) => props.onChange?.(option?.value ?? null)}\n placeholder={props.placeholder}\n disabled={props.disabled}\n name={props.name}\n itemComponent={(itemProps) => (\n <KSelect.Item item={itemProps.item} class=\"zylem-select-item\">\n <KSelect.ItemLabel>{itemProps.item.rawValue.label}</KSelect.ItemLabel>\n <KSelect.ItemIndicator class=\"zylem-select-item-indicator\">\n ✓\n </KSelect.ItemIndicator>\n </KSelect.Item>\n )}\n >\n <Show when={props.label}>\n <KSelect.Label class=\"zylem-field-label\">{props.label}</KSelect.Label>\n </Show>\n <KSelect.Trigger\n ref={layer.anchorRef}\n class=\"zylem-field zylem-select-trigger\"\n aria-label={props.label}\n >\n <KSelect.Value<SelectOption> class=\"zylem-select-value\">\n {(state) => state.selectedOption()?.label}\n </KSelect.Value>\n <KSelect.Icon class=\"zylem-select-icon\">▼</KSelect.Icon>\n </KSelect.Trigger>\n <Show when={layer.mount()} keyed>\n {(mount) => (\n <KSelect.Portal mount={mount}>\n <KSelect.Content\n ref={dismiss.ref}\n class=\"zylem-select-content\"\n onInteractOutside={dismiss.onInteractOutside}\n >\n <KSelect.Listbox class=\"zylem-select-listbox zylem-scroll\" />\n </KSelect.Content>\n </KSelect.Portal>\n )}\n </Show>\n </KSelect.Root>\n );\n}\n","import { Checkbox as KCheckbox } from '@kobalte/core';\nimport Check from 'lucide-solid/icons/check';\nimport { Show } from 'solid-js';\n\nexport interface CheckboxProps {\n label?: string;\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n name?: string;\n class?: string;\n}\n\n/**\n * HyperGlass checkbox: square glass jewel with a beveled checked state.\n */\nexport function Checkbox(props: CheckboxProps) {\n return (\n <KCheckbox.Root\n class={props.class ? `zylem-checkbox-root ${props.class}` : 'zylem-checkbox-root'}\n checked={props.checked}\n defaultChecked={props.defaultChecked}\n onChange={props.onChange}\n disabled={props.disabled}\n name={props.name}\n >\n <KCheckbox.Input class=\"zylem-checkbox-input\" />\n <KCheckbox.Control class=\"zylem-checkbox-control\">\n <KCheckbox.Indicator>\n <Check class=\"zylem-checkbox-icon\" />\n </KCheckbox.Indicator>\n </KCheckbox.Control>\n <Show when={props.label}>\n <KCheckbox.Label class=\"zylem-checkbox-label\">\n {props.label}\n </KCheckbox.Label>\n </Show>\n </KCheckbox.Root>\n );\n}\n","import { Switch as KSwitch } from '@kobalte/core';\nimport { Show } from 'solid-js';\n\nexport interface SwitchProps {\n label?: string;\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n name?: string;\n class?: string;\n}\n\n/**\n * HyperGlass switch: glass pill track with a glossy sliding thumb.\n */\nexport function Switch(props: SwitchProps) {\n return (\n <KSwitch.Root\n class={props.class ? `zylem-switch-root ${props.class}` : 'zylem-switch-root'}\n checked={props.checked}\n defaultChecked={props.defaultChecked}\n onChange={props.onChange}\n disabled={props.disabled}\n name={props.name}\n >\n <KSwitch.Input class=\"zylem-switch-input\" />\n <KSwitch.Control class=\"zylem-switch-control\">\n <KSwitch.Thumb class=\"zylem-switch-thumb\" />\n </KSwitch.Control>\n <Show when={props.label}>\n <KSwitch.Label class=\"zylem-switch-label\">{props.label}</KSwitch.Label>\n </Show>\n </KSwitch.Root>\n );\n}\n","import { Slider as KSlider } from '@kobalte/core';\nimport { Show } from 'solid-js';\n\nexport interface SliderProps {\n label?: string;\n value?: number;\n onChange?: (value: number) => void;\n minValue?: number;\n maxValue?: number;\n step?: number;\n disabled?: boolean;\n showValue?: boolean;\n class?: string;\n}\n\n/**\n * HyperGlass slider: inset glass track, blue glass fill, and a glowing\n * glossy thumb.\n */\nexport function Slider(props: SliderProps) {\n return (\n <KSlider.Root\n class={props.class ? `zylem-slider-root ${props.class}` : 'zylem-slider-root'}\n value={props.value !== undefined ? [props.value] : undefined}\n onChange={(values) => props.onChange?.(values[0])}\n minValue={props.minValue}\n maxValue={props.maxValue}\n step={props.step}\n disabled={props.disabled}\n >\n <Show when={props.label || props.showValue}>\n <div class=\"zylem-slider-header\">\n <Show when={props.label}>\n <KSlider.Label class=\"zylem-slider-label\">\n {props.label}\n </KSlider.Label>\n </Show>\n <Show when={props.showValue}>\n <KSlider.ValueLabel class=\"zylem-slider-value\" />\n </Show>\n </div>\n </Show>\n <KSlider.Track class=\"zylem-slider-track\">\n <KSlider.Fill class=\"zylem-slider-fill\" />\n <KSlider.Thumb class=\"zylem-slider-thumb\">\n <KSlider.Input class=\"zylem-slider-thumb-input\" />\n </KSlider.Thumb>\n </KSlider.Track>\n </KSlider.Root>\n );\n}\n","import { Tabs as KTabs } from '@kobalte/core';\nimport type { JSX } from 'solid-js';\n\nexport interface TabsProps {\n value?: string;\n onChange?: (value: string) => void;\n defaultValue?: string;\n class?: string;\n children: JSX.Element;\n 'aria-label'?: string;\n}\n\n/**\n * HyperGlass tabs: stack-card style tab strip over a glass content panel.\n * Compose with `Tabs.List`, `Tabs.Trigger`, and `Tabs.Content`.\n */\nexport function Tabs(props: TabsProps) {\n return (\n <KTabs.Root\n class={props.class ? `zylem-tabs-root ${props.class}` : 'zylem-tabs-root'}\n value={props.value}\n onChange={props.onChange}\n defaultValue={props.defaultValue}\n aria-label={props['aria-label']}\n >\n {props.children}\n </KTabs.Root>\n );\n}\n\nexport function TabsList(props: { children: JSX.Element; class?: string }) {\n return (\n <KTabs.List\n class={props.class ? `zylem-tabs-list ${props.class}` : 'zylem-tabs-list'}\n >\n {props.children}\n </KTabs.List>\n );\n}\n\nexport function TabsTrigger(props: {\n value: string;\n children: JSX.Element;\n disabled?: boolean;\n class?: string;\n}) {\n return (\n <KTabs.Trigger\n class={\n props.class ? `zylem-tabs-trigger ${props.class}` : 'zylem-tabs-trigger'\n }\n value={props.value}\n disabled={props.disabled}\n >\n {props.children}\n </KTabs.Trigger>\n );\n}\n\nexport function TabsContent(props: {\n value: string;\n children: JSX.Element;\n class?: string;\n}) {\n return (\n <KTabs.Content\n class={\n props.class ? `zylem-tabs-content ${props.class}` : 'zylem-tabs-content'\n }\n value={props.value}\n >\n {props.children}\n </KTabs.Content>\n );\n}\n\nTabs.List = TabsList;\nTabs.Trigger = TabsTrigger;\nTabs.Content = TabsContent;\n","import { Accordion as KAccordion } from '@kobalte/core';\nimport { For } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface AccordionItemConfig {\n id: string;\n title: JSX.Element;\n content: () => JSX.Element;\n}\n\nexport interface AccordionProps {\n items: AccordionItemConfig[];\n multiple?: boolean;\n collapsible?: boolean;\n value?: string[];\n onChange?: (value: string[]) => void;\n defaultValue?: string[];\n class?: string;\n /** Extra class applied to each content region (e.g. scroll helpers). */\n contentClass?: string;\n}\n\n/**\n * HyperGlass accordion: stack of glossy card headers over glass content\n * regions. Uses the same `.zylem-accordion` / `.accordion-*` classes as the\n * editor markup, so both stay visually in sync.\n */\nexport function Accordion(props: AccordionProps) {\n return (\n <KAccordion.Root\n class={props.class ? `zylem-accordion ${props.class}` : 'zylem-accordion'}\n multiple={props.multiple}\n collapsible={props.collapsible ?? true}\n value={props.value}\n onChange={props.onChange}\n defaultValue={props.defaultValue}\n >\n <For each={props.items}>\n {(item) => (\n <KAccordion.Item value={item.id} class=\"accordion-item\">\n <KAccordion.Header class=\"accordion-header\">\n <KAccordion.Trigger class=\"accordion-trigger\">\n {item.title}\n </KAccordion.Trigger>\n </KAccordion.Header>\n <KAccordion.Content\n class={\n props.contentClass\n ? `accordion-content ${props.contentClass}`\n : 'accordion-content'\n }\n >\n {item.content()}\n </KAccordion.Content>\n </KAccordion.Item>\n )}\n </For>\n </KAccordion.Root>\n );\n}\n","import { Tooltip as KTooltip } from '@kobalte/core';\nimport { Show, type JSX } from 'solid-js';\nimport { useLayer } from '../../layers';\n\nexport interface TooltipProps {\n /** Tooltip body. */\n content: JSX.Element;\n /** Trigger element(s). */\n children: JSX.Element;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n openDelay?: number;\n}\n\n/**\n * HyperGlass tooltip: small floating glass sheet, portaled above page chrome\n * so it is not trapped by local stacking contexts (grids, panels, etc.).\n *\n * The portal target is resolved from the trigger rather than assumed to be\n * `document.body`, so a tooltip inside a web component's shadow root still\n * picks up the styles injected there.\n */\nexport function Tooltip(props: TooltipProps) {\n const layer = useLayer('tooltip');\n\n return (\n <KTooltip.Root placement={props.placement} openDelay={props.openDelay ?? 400}>\n <KTooltip.Trigger\n as=\"span\"\n ref={layer.anchorRef}\n style={{ display: 'flex', width: '100%', height: '100%', 'min-width': 0 }}\n >\n {props.children}\n </KTooltip.Trigger>\n <Show when={layer.mount()}>\n {(mount) => (\n <KTooltip.Portal mount={mount()}>\n <KTooltip.Content class=\"zylem-tooltip\">\n {props.content}\n </KTooltip.Content>\n </KTooltip.Portal>\n )}\n </Show>\n </KTooltip.Root>\n );\n}\n","import { DropdownMenu as KDropdownMenu } from '@kobalte/core';\nimport { For, Show } from 'solid-js';\nimport type { JSX } from 'solid-js';\nimport { createDismissGuard, useLayer } from '../../layers';\n\nexport interface DropdownMenuItemConfig {\n id: string;\n label: JSX.Element;\n onSelect?: () => void;\n shortcut?: string;\n disabled?: boolean;\n danger?: boolean;\n /** Render a separator line above this item. */\n separatorAbove?: boolean;\n}\n\nexport interface DropdownMenuProps {\n /** Trigger element; rendered inside a Kobalte trigger button. */\n trigger: JSX.Element;\n items: DropdownMenuItemConfig[];\n placement?: 'bottom-start' | 'bottom-end' | 'bottom' | 'top-start' | 'top-end' | 'top' | 'right-start' | 'left-start';\n /** Class applied to the trigger button. */\n triggerClass?: string;\n}\n\n/**\n * HyperGlass dropdown menu: floating glass sheet with highlight rows.\n *\n * Portals into the layer container for its tree at the `menu` tier, so it opens\n * over panels and dialogs and stays styled inside a shadow root.\n */\nexport function DropdownMenu(props: DropdownMenuProps) {\n const layer = useLayer('menu');\n const dismiss = createDismissGuard();\n\n const items = () => (\n <For each={props.items}>\n {(item) => (\n <>\n <Show when={item.separatorAbove}>\n <KDropdownMenu.Separator class=\"zylem-dropdown-separator\" />\n </Show>\n <KDropdownMenu.Item\n class={\n item.danger\n ? 'zylem-dropdown-item zylem-dropdown-item--danger'\n : 'zylem-dropdown-item'\n }\n disabled={item.disabled}\n onSelect={item.onSelect}\n >\n <span>{item.label}</span>\n <Show when={item.shortcut}>\n <span class=\"zylem-dropdown-shortcut\">{item.shortcut}</span>\n </Show>\n </KDropdownMenu.Item>\n </>\n )}\n </For>\n );\n\n return (\n <KDropdownMenu.Root placement={props.placement ?? 'bottom-start'}>\n <KDropdownMenu.Trigger ref={layer.anchorRef} class={props.triggerClass}>\n {props.trigger}\n </KDropdownMenu.Trigger>\n <Show when={layer.mount()} keyed>\n {(mount) => (\n <KDropdownMenu.Portal mount={mount}>\n <KDropdownMenu.Content\n ref={dismiss.ref}\n class=\"zylem-dropdown-content\"\n onInteractOutside={dismiss.onInteractOutside}\n >\n {items()}\n </KDropdownMenu.Content>\n </KDropdownMenu.Portal>\n )}\n </Show>\n </KDropdownMenu.Root>\n );\n}\n","import { Dialog as KDialog } from '@kobalte/core';\nimport { Show } from 'solid-js';\nimport type { JSX } from 'solid-js';\nimport { createDismissGuard, LayerScope, useLayer } from '../../layers';\nimport { Button } from '../Button/Button';\nimport { WindowControls } from '../WindowControls/WindowControls';\n\nexport interface DialogProps {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n title?: JSX.Element;\n children: JSX.Element;\n /** Optional footer content (e.g. action buttons). */\n footer?: JSX.Element;\n}\n\n/**\n * HyperGlass dialog: glass window with a glossy title bar and jewel close\n * control, centered over a dimmed backdrop.\n *\n * The body is a {@link LayerScope}, so overlays opened from inside the dialog\n * stack against the dialog's own content rather than against the page. A tooltip\n * on a dialog field floats over the dialog, but a menu belonging to the page\n * behind still wins — which is what keeps a dialog from leaking overlays across\n * the rest of the app.\n */\nexport function Dialog(props: DialogProps) {\n const layer = useLayer('modal');\n const dismiss = createDismissGuard();\n\n return (\n <KDialog.Root open={props.open} onOpenChange={props.onOpenChange}>\n {/*\n A dialog is controlled and renders no trigger, so it has nothing in the\n page to resolve its tree from. This marker sits where the dialog was\n declared, which is enough to find an enclosing shadow root.\n */}\n <span ref={layer.anchorRef} style={{ display: 'none' }} aria-hidden=\"true\" />\n <Show when={layer.mount()} keyed>\n {(mount) => (\n <KDialog.Portal mount={mount}>\n <KDialog.Overlay class=\"zylem-dialog-overlay\" />\n <div class=\"zylem-dialog-positioner\">\n <KDialog.Content\n ref={dismiss.ref}\n class=\"zylem-dialog-content\"\n onInteractOutside={dismiss.onInteractOutside}\n >\n <div class=\"zylem-dialog-header\">\n <Show when={props.title}>\n <KDialog.Title class=\"zylem-dialog-title\">\n {props.title}\n </KDialog.Title>\n </Show>\n <WindowControls onClose={() => props.onOpenChange?.(false)} />\n </div>\n <KDialog.Description as=\"div\" class=\"zylem-dialog-body\">\n <LayerScope>{props.children}</LayerScope>\n </KDialog.Description>\n <Show when={props.footer}>\n <div class=\"zylem-dialog-footer\">{props.footer}</div>\n </Show>\n </KDialog.Content>\n </div>\n </KDialog.Portal>\n )}\n </Show>\n </KDialog.Root>\n );\n}\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: JSX.Element;\n message: JSX.Element;\n confirmLabel?: string;\n cancelLabel?: string;\n danger?: boolean;\n onConfirm: () => void;\n}\n\n/**\n * Confirmation dialog built on Dialog — a drop-in replacement for\n * `window.confirm()` flows.\n */\nexport function ConfirmDialog(props: ConfirmDialogProps) {\n return (\n <Dialog\n open={props.open}\n onOpenChange={props.onOpenChange}\n title={props.title ?? 'Confirm'}\n footer={\n <>\n <Button variant=\"ghost\" onClick={() => props.onOpenChange(false)}>\n {props.cancelLabel ?? 'Cancel'}\n </Button>\n <Button\n variant={props.danger ? 'danger' : 'primary'}\n onClick={() => {\n props.onConfirm();\n props.onOpenChange(false);\n }}\n >\n {props.confirmLabel ?? 'Confirm'}\n </Button>\n </>\n }\n >\n {props.message}\n </Dialog>\n );\n}\n","import { Show } from 'solid-js';\nimport PanelBottomClose from 'lucide-solid/icons/panel-bottom-close';\nimport PanelBottomOpen from 'lucide-solid/icons/panel-bottom-open';\nimport X from 'lucide-solid/icons/x';\n\nexport interface WindowControlsProps {\n // Optional props accept an explicit `undefined` so callers compiled with\n // `exactOptionalPropertyTypes` can forward their own optional props directly.\n onClose?: (() => void) | undefined;\n onCollapse?: (() => void) | undefined;\n /** Show the \"expand\" collapse icon when the panel is collapsed. */\n collapsed?: boolean | undefined;\n /** Accessible label/title for the close button (default \"Close panel\"). */\n closeLabel?: string | undefined;\n /** Forwarded as data-testid on the close button. */\n closeTestId?: string | undefined;\n}\n\n/**\n * Shared glass window controls: the same icon buttons used by floating and\n * detached panels. Only controls with a handler are rendered.\n */\nexport function WindowControls(props: WindowControlsProps) {\n return (\n <Show when={props.onClose || props.onCollapse}>\n <div class=\"zylem-window-controls\" aria-label=\"Window controls\">\n <Show when={props.onCollapse}>\n <button\n type=\"button\"\n class=\"zylem-window-control zylem-window-control--collapse\"\n aria-label={props.collapsed ? 'Expand panel' : 'Collapse panel'}\n title={props.collapsed ? 'Expand panel' : 'Collapse panel'}\n onClick={() => props.onCollapse?.()}\n >\n {props.collapsed ? <PanelBottomOpen size={12} /> : <PanelBottomClose size={12} />}\n </button>\n </Show>\n <Show when={props.onClose}>\n <button\n type=\"button\"\n class=\"zylem-window-control zylem-window-control--close\"\n aria-label={props.closeLabel ?? 'Close panel'}\n title={props.closeLabel ?? 'Close panel'}\n data-testid={props.closeTestId}\n onClick={() => props.onClose?.()}\n >\n <X size={12} />\n </button>\n </Show>\n </div>\n </Show>\n );\n}\n","import { Progress as KProgress } from '@kobalte/core';\nimport { Show } from 'solid-js';\n\nexport interface ProgressProps {\n value?: number;\n minValue?: number;\n maxValue?: number;\n label?: string;\n showValue?: boolean;\n indeterminate?: boolean;\n class?: string;\n}\n\n/**\n * HyperGlass progress bar: inset glass track with a glowing blue glass fill.\n */\nexport function Progress(props: ProgressProps) {\n return (\n <KProgress.Root\n class={props.class ? `zylem-progress-root ${props.class}` : 'zylem-progress-root'}\n value={props.value}\n minValue={props.minValue}\n maxValue={props.maxValue}\n indeterminate={props.indeterminate}\n >\n <Show when={props.label || props.showValue}>\n <div class=\"zylem-progress-header\">\n <Show when={props.label}>\n <KProgress.Label class=\"zylem-progress-label\">\n {props.label}\n </KProgress.Label>\n </Show>\n <Show when={props.showValue}>\n <KProgress.ValueLabel class=\"zylem-progress-value\" />\n </Show>\n </div>\n </Show>\n <KProgress.Track class=\"zylem-progress-track\">\n <KProgress.Fill class=\"zylem-progress-fill\" />\n </KProgress.Track>\n </KProgress.Root>\n );\n}\n","import { Separator as KSeparator } from '@kobalte/core';\n\nexport interface SeparatorProps {\n orientation?: 'horizontal' | 'vertical';\n class?: string;\n}\n\n/**\n * HyperGlass separator: soft electric-blue gradient rule.\n */\nexport function Separator(props: SeparatorProps) {\n return (\n <KSeparator.Root\n class={props.class ? `zylem-separator ${props.class}` : 'zylem-separator'}\n orientation={props.orientation}\n />\n );\n}\n","import { Show, splitProps } from 'solid-js';\nimport type { JSX } from 'solid-js';\nimport { WindowControls, type WindowControlsProps } from '../WindowControls/WindowControls';\n\nexport interface TitleBarProps\n extends Omit<JSX.HTMLAttributes<HTMLDivElement>, 'title' | 'onClose'>,\n WindowControlsProps {\n title?: JSX.Element;\n /** Smaller 32px bar for panel headers. */\n compact?: boolean;\n /** Show grab cursor for draggable bars. */\n draggable?: boolean;\n /** Extra content placed between the title and window controls. */\n children?: JSX.Element;\n}\n\n/**\n * HyperGlass title bar: glossy molded glass strip with a title, optional\n * extra chrome, and shared glass window controls.\n */\nexport function TitleBar(props: TitleBarProps) {\n const [local, rest] = splitProps(props, [\n 'title',\n 'compact',\n 'draggable',\n 'children',\n 'onClose',\n 'onCollapse',\n 'collapsed',\n 'closeLabel',\n 'closeTestId',\n 'class',\n ]);\n\n const classes = () =>\n [\n 'zylem-titlebar',\n local.compact ? 'zylem-titlebar--compact' : '',\n local.draggable ? 'zylem-titlebar--draggable' : '',\n local.class ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div class={classes()} {...rest}>\n <Show when={local.title}>\n <span class=\"zylem-titlebar-title\">{local.title}</span>\n </Show>\n {local.children}\n <WindowControls\n onClose={local.onClose}\n onCollapse={local.onCollapse}\n collapsed={local.collapsed}\n closeLabel={local.closeLabel}\n closeTestId={local.closeTestId}\n />\n </div>\n );\n}\n","import { Show, splitProps } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface PanelProps\n extends Omit<JSX.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Optional glossy header title. */\n title?: JSX.Element;\n /** Extra content rendered on the right side of the header. */\n headerActions?: JSX.Element;\n /** Use the brighter window-glass treatment. */\n window?: boolean;\n /** Remove body padding (for consoles, lists, etc.). */\n flush?: boolean;\n /**\n * Drop the border, outer shadow, and background so the panel sits flush\n * inside an already-outlined region.\n */\n borderless?: boolean;\n children?: JSX.Element;\n}\n\n/**\n * HyperGlass panel: glass card with a 1px electric-blue border, inner\n * highlight, subtle blur, and an optional glossy header bar.\n */\nexport function Panel(props: PanelProps) {\n const [local, rest] = splitProps(props, [\n 'title',\n 'headerActions',\n 'window',\n 'flush',\n 'borderless',\n 'children',\n 'class',\n ]);\n\n const classes = () =>\n [\n 'zylem-panel',\n local.window ? 'zylem-panel--window' : '',\n local.borderless ? 'zylem-panel--borderless' : '',\n local.class ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div class={classes()} {...rest}>\n <Show when={local.title || local.headerActions}>\n <div class=\"zylem-panel-header\">\n <span class=\"zylem-panel-header-title\">{local.title}</span>\n {local.headerActions}\n </div>\n </Show>\n <div\n class={\n local.flush\n ? 'zylem-panel-body zylem-panel-body--flush'\n : 'zylem-panel-body'\n }\n >\n {local.children}\n </div>\n </div>\n );\n}\n","import { splitProps } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface ToolbarProps extends JSX.HTMLAttributes<HTMLDivElement> {\n orientation?: 'horizontal' | 'vertical';\n children?: JSX.Element;\n}\n\n/**\n * HyperGlass toolbar: molded glass command strip. Compose with\n * `ToolbarButton` (and `Separator orientation=\"vertical\"` between groups).\n */\nexport function Toolbar(props: ToolbarProps) {\n const [local, rest] = splitProps(props, ['orientation', 'children', 'class']);\n\n const classes = () =>\n [\n 'zylem-toolbar',\n local.orientation === 'vertical' ? 'zylem-toolbar--vertical' : '',\n local.class ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div role=\"toolbar\" class={classes()} {...rest}>\n {local.children}\n </div>\n );\n}\n","import { Show, createMemo } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface PropertyListProps {\n children: JSX.Element;\n class?: string;\n}\n\n/**\n * HyperCard-style field list: wraps `PropertyRow`s in a bordered inset stack.\n */\nexport function PropertyList(props: PropertyListProps) {\n return (\n <div\n class={\n props.class\n ? `zylem-property-list ${props.class}`\n : 'zylem-property-list'\n }\n >\n {props.children}\n </div>\n );\n}\n\nexport interface PropertyRowProps {\n label: string;\n // Optional props accept an explicit `undefined` so callers compiled with\n // `exactOptionalPropertyTypes` can forward their own optional props directly.\n /** The value to display. Can be a string, number, or JSX element. */\n value?: string | number | JSX.Element | undefined;\n /** If true, treat string values as paths and truncate long ones. */\n isPath?: boolean | undefined;\n /** Maximum path segments to show (default: 3). */\n maxPathSegments?: number | undefined;\n /** Called with the full value when a truncated path is clicked. */\n onPathClick?: ((fullValue: string) => void) | undefined;\n valueClass?: string | undefined;\n /** Children can be used instead of value for complex content. */\n children?: JSX.Element | undefined;\n}\n\nfunction truncatePath(\n path: string,\n maxSegments = 3,\n): { truncated: string; isTruncated: boolean } {\n const separator = path.includes('\\\\') ? '\\\\' : '/';\n const segments = path.split(separator).filter(Boolean);\n if (segments.length <= maxSegments) {\n return { truncated: path, isTruncated: false };\n }\n return {\n truncated: `...${separator}${segments.slice(-maxSegments).join(separator)}`,\n isTruncated: true,\n };\n}\n\nfunction looksLikePath(value: string): boolean {\n return (\n value.includes('/') ||\n value.includes('\\\\') ||\n /^[A-Za-z]:/.test(value) ||\n value.startsWith('.') ||\n value.startsWith('~')\n );\n}\n\n/**\n * HyperGlass property row: label/value inspector field with automatic path\n * truncation and click-to-reveal.\n */\nexport function PropertyRow(props: PropertyRowProps) {\n const display = createMemo(() => {\n if (props.children !== undefined) {\n return { element: props.children, isClickable: false, fullValue: null as string | null };\n }\n if (typeof props.value !== 'string') {\n return { element: props.value, isClickable: false, fullValue: null as string | null };\n }\n const stringValue = props.value;\n const shouldTruncate = props.isPath ?? looksLikePath(stringValue);\n if (shouldTruncate) {\n const { truncated, isTruncated } = truncatePath(\n stringValue,\n props.maxPathSegments ?? 3,\n );\n return {\n element: truncated,\n isClickable: isTruncated && !!props.onPathClick,\n fullValue: isTruncated ? stringValue : null,\n };\n }\n return { element: stringValue, isClickable: false, fullValue: null as string | null };\n });\n\n return (\n <div class=\"zylem-property-row\">\n <span class=\"zylem-property-label\">{props.label}</span>\n <Show\n when={display().isClickable}\n fallback={\n <span class={`zylem-property-value ${props.valueClass ?? ''}`}>\n {display().element}\n </span>\n }\n >\n <span\n class={`zylem-property-value zylem-property-value--clickable ${props.valueClass ?? ''}`}\n onClick={() => {\n const fullValue = display().fullValue;\n if (fullValue) props.onPathClick?.(fullValue);\n }}\n title=\"Click to reveal full path\"\n >\n {display().element}\n </span>\n </Show>\n </div>\n );\n}\n","import { Show } from 'solid-js';\nimport type { JSX } from 'solid-js';\nimport { Button } from '../Button/Button';\n\nexport interface ConsoleProps {\n /** Console text content. */\n value: string;\n /** Editable textarea input handler; omit for read-only display. */\n onInput?: (value: string) => void;\n onClear?: () => void;\n readOnly?: boolean;\n class?: string;\n /** Extra action buttons rendered next to Clear. */\n actions?: JSX.Element;\n}\n\n/**\n * HyperGlass console: dark low-gloss terminal field with a floating Clear\n * action.\n */\nexport function Console(props: ConsoleProps) {\n return (\n <div\n class={\n props.class\n ? `zylem-console-container ${props.class}`\n : 'zylem-console-container'\n }\n >\n <div class=\"zylem-console-wrapper\">\n <textarea\n class=\"zylem-console zylem-scroll\"\n value={props.value}\n spellcheck={false}\n readOnly={props.readOnly || !props.onInput}\n onInput={(event) => props.onInput?.(event.currentTarget.value)}\n />\n <Show when={props.onClear || props.actions}>\n <div class=\"zylem-console-actions\">\n {props.actions}\n <Show when={props.onClear}>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => props.onClear?.()}>\n Clear\n </Button>\n </Show>\n </div>\n </Show>\n </div>\n </div>\n );\n}\n","import { Show, splitProps } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface SidebarProps extends JSX.HTMLAttributes<HTMLElement> {\n children?: JSX.Element;\n}\n\n/**\n * HyperGlass sidebar: glass navigation rail. Compose with `SidebarSection`\n * and `SidebarItem`.\n */\nexport function Sidebar(props: SidebarProps) {\n const [local, rest] = splitProps(props, ['children', 'class']);\n return (\n <aside\n class={local.class ? `sidebar zylem-scroll ${local.class}` : 'sidebar zylem-scroll'}\n {...rest}\n >\n {local.children}\n </aside>\n );\n}\n\nexport interface SidebarSectionProps {\n title?: JSX.Element;\n children?: JSX.Element;\n class?: string;\n}\n\nexport function SidebarSection(props: SidebarSectionProps) {\n return (\n <div\n class={\n props.class ? `sidebar-section ${props.class}` : 'sidebar-section'\n }\n >\n <Show when={props.title}>\n <div class=\"sidebar-section-title\">{props.title}</div>\n </Show>\n {props.children}\n </div>\n );\n}\n\nexport interface SidebarItemProps\n extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n active?: boolean;\n children?: JSX.Element;\n}\n\nexport function SidebarItem(props: SidebarItemProps) {\n const [local, rest] = splitProps(props, ['active', 'children', 'class']);\n return (\n <button\n type=\"button\"\n class={local.class ? `sidebar-item ${local.class}` : 'sidebar-item'}\n data-active={local.active ? '' : undefined}\n {...rest}\n >\n {local.children}\n </button>\n );\n}\n\nSidebar.Section = SidebarSection;\nSidebar.Item = SidebarItem;\n\n/** Class hook for anchor-based sidebar items (router links). */\nexport const sidebarItemClass = 'sidebar-item';\n","import { Show, splitProps } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface CardProps\n extends Omit<JSX.HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: JSX.Element;\n description?: JSX.Element;\n /** Renders hover glow + pointer cursor and click affordances. */\n interactive?: boolean;\n selected?: boolean;\n children?: JSX.Element;\n}\n\n/**\n * HyperGlass card: small index-card tile with a blue glow. Use for entity\n * tiles, project tiles, and asset thumbnails.\n */\nexport function Card(props: CardProps) {\n const [local, rest] = splitProps(props, [\n 'title',\n 'description',\n 'interactive',\n 'selected',\n 'children',\n 'class',\n ]);\n\n const classes = () =>\n [\n 'zylem-card',\n local.interactive ? 'zylem-card--interactive' : '',\n local.selected ? 'zylem-card--selected' : '',\n local.class ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n class={classes()}\n role={local.interactive ? 'button' : undefined}\n tabIndex={local.interactive ? 0 : undefined}\n {...rest}\n >\n <Show when={local.title}>\n <div class=\"zylem-card-title\">{local.title}</div>\n </Show>\n {local.children}\n <Show when={local.description}>\n <div class=\"zylem-card-description\">{local.description}</div>\n </Show>\n </div>\n );\n}\n","import { Popover as KPopover } from '@kobalte/core';\nimport { Show, createSignal, type JSX } from 'solid-js';\nimport { createDismissGuard, useLayer } from '../../layers';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\nexport interface MenuButtonProps {\n /** Accessible name, and the tooltip text unless `tooltip` overrides it. */\n label: string;\n /** Button face content, usually an icon. */\n children: JSX.Element;\n /** Panel content: a menu, a picker, anything. Rendered only while open. */\n menu: (close: () => void) => JSX.Element;\n /**\n * Primary action for the face. Given one, the button splits: the face fires\n * this and the chevron opens the menu. Without one, the whole button opens\n * the menu and the chevron is only there to say so.\n *\n * Optional props here accept an explicit `undefined` so a caller compiled with\n * `exactOptionalPropertyTypes` can decide the split at the call site.\n */\n onAction?: (() => void) | undefined;\n /** Renders the face in its selected state. */\n selected?: boolean | undefined;\n disabled?: boolean | undefined;\n /** Tooltip text; defaults to `label`. Pass `null` for no tooltip. */\n tooltip?: string | null | undefined;\n placement?:\n | 'bottom-start'\n | 'bottom-end'\n | 'bottom'\n | 'top-start'\n | 'top-end'\n | 'top'\n | undefined;\n /** Controlled open state. Omit to let the button own it. */\n open?: boolean | undefined;\n onOpenChange?: ((open: boolean) => void) | undefined;\n class?: string | undefined;\n}\n\n/**\n * Shown in both modes, because a chevron means \"this has a menu\" and that is\n * true whether or not the face carries its own action.\n */\nconst CHEVRON = '▾';\n\n/**\n * A toolbar button that owns a menu, optionally split.\n *\n * Split mode exists because choosing and doing are separate jobs: the face\n * repeats the last choice and the chevron is there for picking a different one.\n * Placing ten of the same thing is then one trip through the menu and ten\n * clicks, rather than ten trips.\n *\n * The panel is layered at the `menu` tier and portaled out of the button's own\n * subtree, so a toolbar that clips its overflow or sits in a lower stacking\n * context cannot hide it.\n */\nexport function MenuButton(props: MenuButtonProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = createSignal(false);\n const layer = useLayer('menu');\n const dismiss = createDismissGuard();\n\n const isOpen = () => props.open ?? uncontrolledOpen();\n const setOpen = (open: boolean) => {\n setUncontrolledOpen(open);\n props.onOpenChange?.(open);\n };\n\n const isSplit = () => props.onAction !== undefined;\n const tooltipText = () =>\n props.tooltip === null ? null : props.tooltip ?? props.label;\n\n /** Wrap in a tooltip only when there is text for one. */\n const described = (content: JSX.Element) => (\n <Show when={tooltipText()} fallback={content} keyed>\n {(text) => <Tooltip content={text}>{content}</Tooltip>}\n </Show>\n );\n\n return (\n <div\n class={props.class ? `zylem-menu-button ${props.class}` : 'zylem-menu-button'}\n data-split={isSplit() ? '' : undefined}\n >\n <KPopover.Root\n open={isOpen()}\n onOpenChange={setOpen}\n placement={props.placement ?? 'bottom-start'}\n >\n <Show\n when={isSplit()}\n fallback={described(\n <KPopover.Trigger\n ref={layer.anchorRef}\n class=\"zylem-toolbar-btn zylem-menu-button__face\"\n aria-label={props.label}\n disabled={props.disabled}\n data-selected={props.selected ? '' : undefined}\n >\n {props.children}\n {/*\n * Signage only: the button around it already opens the menu, so\n * this must not read as a second control.\n */}\n <span\n class=\"zylem-menu-button__chevron zylem-menu-button__chevron--static\"\n aria-hidden=\"true\"\n >\n {CHEVRON}\n </span>\n </KPopover.Trigger>,\n )}\n >\n {described(\n <button\n type=\"button\"\n ref={layer.anchorRef}\n class=\"zylem-toolbar-btn zylem-menu-button__face\"\n aria-label={props.label}\n disabled={props.disabled}\n data-selected={props.selected ? '' : undefined}\n onClick={() => props.onAction?.()}\n >\n {props.children}\n </button>,\n )}\n <KPopover.Trigger\n class=\"zylem-menu-button__chevron\"\n aria-label={`${props.label} options`}\n disabled={props.disabled}\n >\n <span aria-hidden=\"true\">{CHEVRON}</span>\n </KPopover.Trigger>\n </Show>\n\n <Show when={layer.mount()} keyed>\n {(mount) => (\n <KPopover.Portal mount={mount}>\n <KPopover.Content\n ref={dismiss.ref}\n class=\"zylem-menu-button__panel\"\n onInteractOutside={dismiss.onInteractOutside}\n >\n {props.menu(() => setOpen(false))}\n </KPopover.Content>\n </KPopover.Portal>\n )}\n </Show>\n </KPopover.Root>\n </div>\n );\n}\n","import { For, Show, createMemo, createSignal, type JSX } from 'solid-js';\nimport { SearchInput } from '../SearchInput/SearchInput';\nimport { filterItems, groupItems, type PickerItem } from './filter-items';\n\nexport interface ItemPickerProps<T extends PickerItem = PickerItem> {\n items: T[];\n onSelect: (item: T) => void;\n /** Marked as the current choice. */\n selectedId?: string | null | undefined;\n /** Hide the search field for a list short enough not to need one. */\n searchable?: boolean | undefined;\n searchPlaceholder?: string | undefined;\n /**\n * Focus the search field on mount. On by default: the picker is opened\n * deliberately, so typing straight into it is the expected behaviour.\n */\n autoFocus?: boolean | undefined;\n /** Shown when `items` is empty, as opposed to filtered down to nothing. */\n emptyMessage?: JSX.Element | undefined;\n class?: string | undefined;\n}\n\n/**\n * Searchable, grouped list of choices — the picker half of a MenuButton, and\n * usable on its own.\n *\n * Icons arrive as markup strings rather than components because the common case\n * is a list supplied at runtime by something that does not share an icon library\n * with the UI (the editor's entity catalog comes over a bridge from the running\n * game, for instance).\n */\nexport function ItemPicker<T extends PickerItem>(props: ItemPickerProps<T>) {\n const [query, setQuery] = createSignal('');\n\n const searchable = () => props.searchable !== false;\n const groups = createMemo(() => groupItems(filterItems(props.items, query())));\n\n return (\n <div class={props.class ? `zylem-picker ${props.class}` : 'zylem-picker'}>\n <Show when={searchable()}>\n <SearchInput\n class=\"zylem-picker__search\"\n value={query()}\n onInput={setQuery}\n placeholder={props.searchPlaceholder ?? 'Search…'}\n ref={(element) => {\n if (props.autoFocus === false) return;\n // Deferred: the element is not focusable until it is in the document,\n // which for a portaled panel is after this ref runs.\n queueMicrotask(() => element.focus());\n }}\n />\n </Show>\n\n <Show\n when={props.items.length}\n fallback={\n <p class=\"zylem-picker__empty\">\n {props.emptyMessage ?? 'Nothing to choose from.'}\n </p>\n }\n >\n <Show\n when={groups().length}\n fallback={\n <p class=\"zylem-picker__empty\">No matches for “{query()}”.</p>\n }\n >\n <div class=\"zylem-picker__groups zylem-scroll\">\n <For each={groups()}>\n {(group) => (\n <div class=\"zylem-picker__group\">\n <h4 class=\"zylem-picker__group-title\">{group.group}</h4>\n <For each={group.items}>\n {(item) => (\n <button\n type=\"button\"\n class=\"zylem-picker__item\"\n disabled={item.disabled}\n data-selected={\n props.selectedId === item.id ? '' : undefined\n }\n title={item.description}\n onClick={() => props.onSelect(item)}\n >\n <Show when={item.icon}>\n {(icon) => (\n <span\n class=\"zylem-picker__item-glyph\"\n // Markup from the caller's own registry, in the\n // caller's own realm; not a new trust boundary.\n innerHTML={icon()}\n />\n )}\n </Show>\n <span class=\"zylem-picker__item-label\">{item.label}</span>\n </button>\n )}\n </For>\n </div>\n )}\n </For>\n </div>\n </Show>\n </Show>\n </div>\n );\n}\n","import Search from 'lucide-solid/icons/search';\nimport type { JSX } from 'solid-js';\n\nexport interface SearchInputProps {\n value?: string;\n onInput?: (value: string) => void;\n placeholder?: string;\n class?: string;\n 'aria-label'?: string;\n onKeyDown?: JSX.EventHandlerUnion<HTMLInputElement, KeyboardEvent>;\n /** Handle on the input itself, for callers that need to focus it. */\n ref?: (element: HTMLInputElement) => void;\n}\n\n/**\n * HyperGlass search input: inset glass field with a leading search icon.\n */\nexport function SearchInput(props: SearchInputProps) {\n return (\n <div class={props.class ? `zylem-search ${props.class}` : 'zylem-search'}>\n <Search class=\"zylem-search-icon\" />\n <input\n type=\"search\"\n ref={props.ref}\n class=\"zylem-field zylem-search-input\"\n value={props.value ?? ''}\n placeholder={props.placeholder ?? 'Search...'}\n aria-label={props['aria-label'] ?? props.placeholder ?? 'Search'}\n onInput={(event) => props.onInput?.(event.currentTarget.value)}\n onKeyDown={props.onKeyDown}\n />\n </div>\n );\n}\n","/**\n * Search and grouping for {@link ItemPicker}, kept pure and separate so the\n * matching rules can be tested and reused without rendering anything.\n */\n\n/**\n * Optional fields accept an explicit `undefined` so callers compiled with\n * `exactOptionalPropertyTypes` can map their own optional data straight across\n * without narrowing every field first.\n */\nexport interface PickerItem {\n id: string;\n label: string;\n /** Heading this item is filed under. Ungrouped items fall under `Other`. */\n group?: string | undefined;\n /**\n * Leading glyph. A string is treated as inline SVG or HTML markup, which is\n * what a host that does not share an icon library can realistically supply.\n */\n icon?: string | undefined;\n /** Shown as the row's title attribute. */\n description?: string | undefined;\n /** Extra search terms that are not visible on the row. */\n tags?: string[] | undefined;\n disabled?: boolean | undefined;\n}\n\nexport interface PickerGroup<T extends PickerItem = PickerItem> {\n group: string;\n items: T[];\n}\n\n/** Heading for items that declare no group. */\nexport const UNGROUPED_LABEL = 'Other';\n\n/**\n * Filter by a query matched against label, id, and tags. An empty or\n * whitespace-only query returns everything, so an unopened search box is not a\n * filter.\n */\nexport function filterItems<T extends PickerItem>(items: T[], query: string): T[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return items;\n\n return items.filter((item) => {\n if (item.label.toLowerCase().includes(needle)) return true;\n if (item.id.toLowerCase().includes(needle)) return true;\n return item.tags?.some((tag) => tag.toLowerCase().includes(needle)) ?? false;\n });\n}\n\n/**\n * Bucket items under their group.\n *\n * Order comes from the input rather than the alphabet, for both the groups and\n * the items within them: the caller has already decided what should be near the\n * top, and sorting here would throw that away.\n */\nexport function groupItems<T extends PickerItem>(items: T[]): PickerGroup<T>[] {\n const groups: PickerGroup<T>[] = [];\n const byName = new Map<string, T[]>();\n\n for (const item of items) {\n const name = item.group ?? UNGROUPED_LABEL;\n let bucket = byName.get(name);\n if (!bucket) {\n bucket = [];\n byName.set(name, bucket);\n groups.push({ group: name, items: bucket });\n }\n bucket.push(item);\n }\n\n return groups;\n}\n","import { Show } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface EmptyStateProps {\n title?: JSX.Element;\n children?: JSX.Element;\n /** Optional action (e.g. a Button). */\n action?: JSX.Element;\n class?: string;\n}\n\n/**\n * HyperGlass empty state: dashed glass placeholder card for empty lists and\n * unbuilt modes.\n */\nexport function EmptyState(props: EmptyStateProps) {\n return (\n <div\n class={\n props.class ? `zylem-empty-state ${props.class}` : 'zylem-empty-state'\n }\n >\n <Show when={props.title}>\n <div class=\"zylem-empty-state-title\">{props.title}</div>\n </Show>\n <Show when={props.children}>\n <div class=\"zylem-empty-state-message\">{props.children}</div>\n </Show>\n {props.action}\n </div>\n );\n}\n","import { splitProps } from 'solid-js';\nimport type { JSX } from 'solid-js';\n\nexport interface ScrollAreaProps extends JSX.HTMLAttributes<HTMLDivElement> {\n /** Scroll direction; defaults to vertical. */\n direction?: 'vertical' | 'horizontal' | 'both';\n children?: JSX.Element;\n}\n\n/**\n * HyperGlass scroll area: wrapper that opts into the visible Aqua-glass\n * scrollbar rail (`.zylem-scroll`, defined in hyperglass-base.css.ts).\n */\nexport function ScrollArea(props: ScrollAreaProps) {\n const [local, rest] = splitProps(props, ['direction', 'children', 'class', 'style']);\n\n const overflow = () => {\n switch (local.direction) {\n case 'horizontal':\n return { 'overflow-x': 'auto', 'overflow-y': 'hidden' } as const;\n case 'both':\n return { overflow: 'auto' } as const;\n default:\n return { 'overflow-y': 'auto', 'overflow-x': 'hidden' } as const;\n }\n };\n\n return (\n <div\n class={local.class ? `zylem-scroll ${local.class}` : 'zylem-scroll'}\n style={{\n ...overflow(),\n 'min-height': 0,\n ...(typeof local.style === 'object' ? local.style : {}),\n }}\n {...rest}\n >\n {local.children}\n </div>\n );\n}\n","import { LayerProvider } from '@zylem/ui/components';\nimport { render } from 'solid-js/web';\nimport {\n createMemo,\n createSignal,\n For,\n onCleanup,\n onMount,\n Show,\n type Component,\n} from 'solid-js';\n\nimport { Menu } from './editor-panel/Menu';\nimport { EditorToggleButton } from './EditorToggleButton';\nimport { FloatingPanel, type DockRequest } from './common/FloatingPanel';\nimport { DetachedPanel } from './editor-panel/DetachedPanel';\nimport {\n applyDefaultDocks,\n computeDockLayout,\n debugStore,\n detachPanel,\n dockPanelToSide,\n findDockedSide,\n isPanelDetached,\n MAIN_PANEL_ID,\n setPanelPosition,\n setPanelSize,\n undockPanelFromSides,\n type DockPanelId,\n type DockSide,\n type EditorDockDefaults,\n} from '.';\nimport { viewportSize } from './common/viewport';\n\n// Panel dimensions\nconst PANEL_WIDTH = 460;\nconst PANEL_HEIGHT = 600;\nconst PANEL_MARGIN = 20;\nconst VIEWPORT_PANEL_MARGIN = 12;\nconst MOBILE_BOTTOM_BAR_ALLOWANCE = 92;\n\nexport type EditorLauncherMode = 'floating' | 'hidden';\n\nexport interface EditorController {\n openPanel: () => void;\n closePanel: () => void;\n togglePanel: () => void;\n /**\n * Dock a panel to a viewport edge, or pass `null` to float it.\n * Defaults to the main editor panel; any other id is a section, which is\n * detached from the accordion first.\n */\n dockPanel: (side: DockSide | null, panelId?: DockPanelId) => void;\n}\n\ninterface EditorProps {\n launcherMode?: EditorLauncherMode | undefined;\n /** First-run dock layout; ignored once the user has their own. */\n defaultDocks?: EditorDockDefaults | undefined;\n onControllerReady?:\n | ((controller: EditorController | null) => void)\n | undefined;\n}\n\nconst getViewportFittedPanelLayout = (\n bottomOffset = 0,\n): {\n initialPosition: { x: number; y: number };\n initialSize: { width: number; height: number };\n} => {\n const inset = VIEWPORT_PANEL_MARGIN;\n const availableWidth = Math.max(300, window.innerWidth - inset * 2);\n const availableHeight = Math.max(\n 200,\n window.innerHeight - bottomOffset - inset * 2,\n );\n const width = Math.min(PANEL_WIDTH, availableWidth);\n const height = Math.min(PANEL_HEIGHT, availableHeight);\n const topInset = inset;\n const bottomLimit = window.innerHeight - bottomOffset - inset;\n const centeredY =\n Math.round((bottomLimit - topInset - height) / 2) + topInset;\n\n return {\n initialPosition: {\n x: Math.max(inset, Math.round((window.innerWidth - width) / 2)),\n y: Math.max(topInset, centeredY),\n },\n initialSize: { width, height },\n };\n};\n\n/**\n * Calculate the initial panel position based on the toggle button's quadrant.\n * Panel appears in the same quadrant as the button.\n */\nconst getInitialPanelPosition = () => {\n // Use saved position if available\n if (debugStore.panelPosition) {\n return debugStore.panelPosition;\n }\n\n const buttonPos = debugStore.toggleButtonPosition;\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n\n // Determine which quadrant the button is in\n const isRightSide = buttonPos.x > windowWidth / 2;\n const isBottomSide = buttonPos.y > windowHeight / 2;\n\n // Position panel in the same quadrant, offset from the button\n let x: number;\n let y: number;\n\n if (isRightSide) {\n // Right side: align panel to right edge\n x = windowWidth - PANEL_WIDTH - PANEL_MARGIN;\n } else {\n // Left side: align panel to left edge\n x = PANEL_MARGIN;\n }\n\n if (isBottomSide) {\n // Bottom: position panel above or at bottom\n y = Math.max(PANEL_MARGIN, windowHeight - PANEL_HEIGHT - PANEL_MARGIN);\n } else {\n // Top: position panel near top\n y = PANEL_MARGIN;\n }\n\n return { x, y };\n};\n\n/**\n * Editor root component. Handles open/close state and layout.\n * Renders both the main editor panel and any detached floating panels.\n */\nexport const Editor: Component<EditorProps> = (props) => {\n const [isOpen, setIsOpen] = createSignal(false);\n const [dockRequest, setDockRequest] = createSignal<DockRequest | null>(null);\n const launcherMode = () => props.launcherMode ?? 'floating';\n\n // Seed before the panel renders, so its first layout already reflects the\n // host's requested docks. No-ops once the user has a layout of their own.\n applyDefaultDocks(props.defaultDocks);\n\n const toggleMenu = () => {\n setIsOpen((open) => !open);\n };\n const closeMenu = () => setIsOpen(false);\n const openMenu = () => setIsOpen(true);\n\n const handlePanelMove = (pos: { x: number; y: number }) => {\n setPanelPosition(pos);\n };\n\n const mainDockedSide = () => findDockedSide(debugStore.docks, MAIN_PANEL_ID);\n\n // Get list of detached panel IDs\n const getDetachedPanelIds = () => Object.keys(debugStore.detachedPanels);\n\n const shouldViewportFitPanel = () => {\n if (typeof window === 'undefined') {\n return launcherMode() === 'hidden';\n }\n\n return (\n launcherMode() === 'hidden' ||\n window.innerWidth < PANEL_WIDTH + PANEL_MARGIN * 2 ||\n window.innerHeight < PANEL_HEIGHT + PANEL_MARGIN * 2\n );\n };\n\n const panelLayout = createMemo(() => {\n // A docked panel's geometry belongs to the dock registry.\n if (mainDockedSide()) {\n const rect = computeDockLayout(debugStore.docks, viewportSize())[MAIN_PANEL_ID];\n if (rect) {\n return {\n initialPosition: { x: rect.x, y: rect.y },\n initialSize: { width: rect.width, height: rect.height },\n };\n }\n }\n\n const fallback =\n typeof window === 'undefined' || !shouldViewportFitPanel()\n ? {\n initialPosition: getInitialPanelPosition(),\n initialSize: { width: PANEL_WIDTH, height: PANEL_HEIGHT },\n }\n : getViewportFittedPanelLayout(\n launcherMode() === 'hidden' ? MOBILE_BOTTOM_BAR_ALLOWANCE : 0,\n );\n\n // A size the user chose outranks the viewport-fitted default.\n return {\n initialPosition: fallback.initialPosition,\n initialSize: debugStore.panelSize ?? fallback.initialSize,\n };\n });\n\n const controller: EditorController = {\n openPanel: openMenu,\n closePanel: closeMenu,\n togglePanel: toggleMenu,\n dockPanel: (side, panelId = MAIN_PANEL_ID) => {\n if (panelId === MAIN_PANEL_ID) {\n // The panel owns the undock/restore path, so route through it.\n openMenu();\n setDockRequest((previous) => ({ side, nonce: (previous?.nonce ?? 0) + 1 }));\n return;\n }\n\n if (side === null) {\n undockPanelFromSides(panelId);\n return;\n }\n\n // Only a detached section can hold a dock slot.\n if (!isPanelDetached(panelId)) {\n detachPanel(panelId, { x: 100, y: 100 });\n }\n dockPanelToSide(panelId, side);\n },\n };\n\n onMount(() => {\n props.onControllerReady?.(controller);\n });\n\n onCleanup(() => {\n props.onControllerReady?.(null);\n });\n\n return (\n // The provider resolves the editor's shadow root once and owns the container\n // every overlay portals into. Without it each overlay resolves its own, and\n // more importantly they would land in `document.body`, outside the tree the\n // editor's styles are injected into.\n <LayerProvider>\n <div\n style={{\n display: 'flex',\n height: '100vh',\n width: '100vw',\n position: 'absolute',\n // The overlay must never swallow input meant for the game underneath;\n // interactive children opt back in with pointer-events: auto.\n 'pointer-events': 'none',\n }}\n >\n <Show when={launcherMode() !== 'hidden'}>\n <EditorToggleButton onToggle={toggleMenu} />\n </Show>\n <Show when={isOpen()}>\n <FloatingPanel\n title=\"Zylem Editor\"\n initialPosition={panelLayout().initialPosition}\n initialSize={panelLayout().initialSize}\n floatingSize={debugStore.panelSize ?? { width: PANEL_WIDTH, height: PANEL_HEIGHT }}\n minSize={{ width: 300, height: 200 }}\n collapsible={true}\n onClose={closeMenu}\n onMove={handlePanelMove}\n onResize={setPanelSize}\n dockRequest={dockRequest}\n >\n {(isCollapsed) => <Menu isCollapsed={isCollapsed} />}\n </FloatingPanel>\n </Show>\n\n {/* Render detached panels */}\n <For each={getDetachedPanelIds()}>\n {(panelId) => <DetachedPanel panelId={panelId} />}\n </For>\n\n {/* Right area reserved for future content */}\n <div style={{ flex: 1 }} />\n </div>\n </LayerProvider>\n );\n};\n\n// Only render if we're not in a test environment and the container exists\nif (typeof window !== 'undefined' && !import.meta.env.VITEST) {\n const container = document.getElementById('zylem-editor-container');\n if (container) {\n render(() => <Editor />, container);\n }\n}\n","import { Show, type Component, type Accessor } from 'solid-js';\nimport { Toolbar } from '../toolbar/Toolbar';\nimport { AccordionMenu } from './AccordionMenu';\n\ninterface MenuProps {\n isCollapsed: Accessor<boolean>;\n}\n\nexport const Menu: Component<MenuProps> = (props) => {\n return (\n <div class=\"zylem-menu\">\n <Toolbar />\n <Show when={!props.isCollapsed()}>\n <AccordionMenu />\n </Show>\n </div>\n );\n};\n","import Trash2 from 'lucide-solid/icons/trash-2';\nimport type { Component } from 'solid-js';\nimport { setDebugTool, debugStore } from '..';\nimport { sendTool } from '../../bridge/editor-bridge';\nimport { ToolbarButton } from '@zylem/ui/components';\n\nexport const DeleteButton: Component = () => {\n const handleClick = () => {\n const newTool = debugStore.tool === 'delete' ? 'none' : 'delete';\n setDebugTool(newTool);\n sendTool(newTool);\n };\n\n return (\n <ToolbarButton\n label=\"Delete\"\n selected={debugStore.tool === 'delete'}\n onClick={handleClick}\n >\n <Trash2 class=\"zylem-icon\" />\n </ToolbarButton>\n );\n};\n","/**\n * Editor Event Bus\n * \n * Wraps the shared zylemEventBus to provide backward-compatible API\n * for the editor package. This allows external code to dispatch state\n * updates to the editor using the familiar editorEvents API.\n */\n\nimport { zylemEventBus, type ZylemEvents } from '@zylem/game-lib/events';\n\nexport type EditorEventType = 'debug' | 'game' | 'stage' | 'entities';\n\nexport interface EditorEvent<T = unknown> {\n\ttype: EditorEventType;\n\tpayload: T;\n}\n\n// Map legacy editor event types to zylemEventBus event types\nconst eventTypeMap: Record<EditorEventType, keyof ZylemEvents> = {\n\tdebug: 'debug',\n\tgame: 'loading:start', // or could be mapped differently based on needs\n\tstage: 'stage:loaded',\n\tentities: 'entity:spawned',\n};\n\ntype EventHandler<T = unknown> = (event: EditorEvent<T>) => void;\n\n/**\n * Backward-compatible wrapper around zylemEventBus.\n * Maintains the existing editorEvents.emit({ type, payload }) API\n * while internally using the shared Mitt-based event bus.\n */\nclass EditorEventBusWrapper {\n\tprivate legacyListeners = new Map<EditorEventType, Set<EventHandler>>();\n\n\t/**\n\t * Emit an event to all registered listeners of that type.\n\t * Also emits to the global zylemEventBus for cross-package communication.\n\t */\n\temit<T>(event: EditorEvent<T>): void {\n\t\t// Emit to legacy listeners (backward compatibility)\n\t\tconst handlers = this.legacyListeners.get(event.type);\n\t\tif (handlers) {\n\t\t\tfor (const handler of handlers) {\n\t\t\t\thandler(event);\n\t\t\t}\n\t\t}\n\n\t\t// Also emit to zylemEventBus for cross-package communication\n\t\tconst mappedEvent = eventTypeMap[event.type];\n\t\tif (mappedEvent) {\n\t\t\t(zylemEventBus as any).emit(mappedEvent, event.payload);\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to events of a specific type.\n\t * Returns an unsubscribe function.\n\t */\n\ton<T>(type: EditorEventType, handler: EventHandler<T>): () => void {\n\t\tif (!this.legacyListeners.has(type)) {\n\t\t\tthis.legacyListeners.set(type, new Set());\n\t\t}\n\t\tthis.legacyListeners.get(type)!.add(handler as EventHandler);\n\t\t\n\t\treturn () => {\n\t\t\tthis.legacyListeners.get(type)?.delete(handler as EventHandler);\n\t\t};\n\t}\n\n\t/**\n\t * Remove all listeners (useful for cleanup).\n\t */\n\tclear(): void {\n\t\tthis.legacyListeners.clear();\n\t}\n}\n\n/**\n * Global editor event bus instance.\n * \n * Usage from game-lib:\n * ```ts\n * import { editorEvents } from '@zylem/editor';\n * editorEvents.emit({ type: 'debug', payload: { enabled: true } });\n * ```\n * \n * Usage from editor components:\n * ```ts\n * editorEvents.on('debug', (e) => setDebugState(e.payload));\n * ```\n */\nexport const editorEvents = new EditorEventBusWrapper();\n\n/**\n * Re-export zylemEventBus for direct access when needed.\n */\nexport { zylemEventBus };\n","/**\n * Entities state for the entities section.\n * Manages debug state and entity selection/hover.\n */\n\nimport { proxy } from 'valtio/vanilla';\nimport { editorEvents } from '../events';\n\nexport type DebugTools = 'select' | 'translate' | 'rotate' | 'scale' | 'delete' | 'add' | 'none';\n\nexport interface DebugState {\n paused: boolean;\n tool: DebugTools;\n selectedEntityId: string | null;\n /**\n * Full selection, mirroring the game. `selectedEntityId` is its first entry,\n * kept so single-select consumers need no change.\n */\n selectedEntityIds: string[];\n hoveredEntityId: string | null;\n /**\n * Most recently selected or created entity, kept after it is deselected.\n *\n * What the gizmo tools fall back to: pressing Rotate with nothing selected\n * should turn the thing you were last working on, rather than nothing. Never\n * cleared on deselect — only overwritten — and validated against the current\n * entity list at the point of use, since the entity it names can be deleted\n * or undone away.\n */\n lastTouchedEntityId: string | null;\n flags: Set<string>;\n}\n\nexport const debugState = proxy<DebugState>({\n paused: false,\n tool: 'none',\n selectedEntityId: null,\n selectedEntityIds: [],\n hoveredEntityId: null,\n lastTouchedEntityId: null,\n flags: new Set(),\n});\n\n// Convenience functions\nexport function isPaused(): boolean {\n return debugState.paused;\n}\n\nexport function setPaused(paused: boolean): void {\n debugState.paused = paused;\n}\n\nexport function setDebugFlag(flag: string, value: boolean): void {\n if (value) {\n debugState.flags.add(flag);\n } else {\n debugState.flags.delete(flag);\n }\n}\n\nexport function getDebugTool(): DebugTools {\n return debugState.tool;\n}\n\nexport function setDebugTool(tool: DebugTools): void {\n debugState.tool = tool;\n}\n\nexport function getHoveredEntityId(): string | null {\n return debugState.hoveredEntityId;\n}\n\nexport function setHoveredEntityId(id: string | null): void {\n debugState.hoveredEntityId = id;\n}\n\nexport function resetHoveredEntity(): void {\n debugState.hoveredEntityId = null;\n}\n\nexport function getSelectedEntityId(): string | null {\n return debugState.selectedEntityId;\n}\n\nexport function setSelectedEntityId(id: string | null): void {\n debugState.selectedEntityId = id;\n debugState.selectedEntityIds = id ? [id] : [];\n if (id) debugState.lastTouchedEntityId = id;\n}\n\nexport function getSelectedEntityIds(): string[] {\n return [...debugState.selectedEntityIds];\n}\n\n/**\n * Record an entity as the one most recently worked on.\n *\n * Separate from selection because creating an entity counts too: placing a box\n * and then pressing Rotate should turn that box, even though placement leaves it\n * unselected. Ignores null so a deselect does not erase the memory.\n */\nexport function noteTouchedEntity(id: string | null): void {\n if (!id) return;\n debugState.lastTouchedEntityId = id;\n}\n\nexport function getLastTouchedEntityId(): string | null {\n return debugState.lastTouchedEntityId;\n}\n\n// Subscribe to external events\neditorEvents.on<Partial<DebugState>>('debug', (event) => {\n const payload = event.payload;\n if (payload.paused !== undefined) debugState.paused = payload.paused;\n if (payload.tool !== undefined) debugState.tool = payload.tool;\n if (payload.selectedEntityId !== undefined) debugState.selectedEntityId = payload.selectedEntityId;\n if (payload.hoveredEntityId !== undefined) debugState.hoveredEntityId = payload.hoveredEntityId;\n});\n","/**\n * Game state for the game section.\n * Manages global game variables and state.\n */\n\nimport { proxy } from 'valtio/vanilla';\nimport { editorEvents } from '../events';\n\n/** Game config state from game-lib */\nexport interface GameConfigState {\n id: string;\n aspectRatio: number;\n fullscreen: boolean;\n bodyBackground: string | undefined;\n internalResolution: { width: number; height: number } | undefined;\n debug: boolean;\n}\n\nexport interface GameState {\n id: string;\n globals: Record<string, unknown>;\n time: number;\n config: GameConfigState | null;\n}\n\nexport const gameState = proxy<GameState>({\n id: '',\n globals: {},\n time: 0,\n config: null,\n});\n\n/**\n * Get the entire globals object.\n */\nexport function getGlobalState(): Record<string, unknown> {\n return gameState.globals;\n}\n\n/**\n * Get a specific global value by key.\n */\nexport function getGlobal<T = unknown>(key: string): T | undefined {\n return gameState.globals[key] as T | undefined;\n}\n\n/**\n * Set a global value.\n */\nexport function setGlobal(key: string, value: unknown): void {\n gameState.globals[key] = value;\n}\n\n// Subscribe to local editor events (internal to editor package)\neditorEvents.on<Partial<GameState>>('game', (event) => {\n const payload = event.payload;\n if (payload.id !== undefined) gameState.id = payload.id;\n if (payload.time !== undefined) gameState.time = payload.time;\n if (payload.globals !== undefined) {\n // Merge globals rather than replace\n Object.assign(gameState.globals, payload.globals);\n }\n});\n\n// Game-lib updates (config, global variables) arrive through the typed\n// bridge — see src/bridge/editor-bridge.ts.\n\n// Backwards compatibility alias\nexport { gameState as state };\n","/**\n * Stage state for the stages section.\n * Manages stage configuration and entity list.\n */\n\nimport { proxy } from 'valtio/vanilla';\nimport { editorEvents } from '../events';\nimport type { BaseEntityInterface, StageStateInterface } from '../../types';\n\nexport const stageState = proxy<StageStateInterface>({\n config: null,\n backgroundColor: null,\n backgroundImage: null,\n inputs: {\n p1: ['gamepad-1', 'keyboard-1'],\n p2: ['gamepad-2', 'keyboard-2'],\n },\n variables: {},\n gravity: { x: 0, y: 0, z: 0 },\n entities: [],\n});\n\n/**\n * Convert stage state to a human-readable string for debugging.\n */\nexport const stageStateToString = (state: StageStateInterface): string => {\n let str = '\\n';\n for (const key in state) {\n const value = state[key as keyof StageStateInterface];\n str += `${key}:\\n`;\n if (key === 'entities') {\n for (const entity of state.entities) {\n str += ` ${entity.uuid}: ${entity.name}\\n`;\n }\n continue;\n }\n if (typeof value === 'object' && value !== null) {\n for (const subKey in value as Record<string, any>) {\n const subValue = (value as Record<string, any>)[subKey];\n if (subValue) {\n str += ` ${subKey}: ${subValue}\\n`;\n }\n }\n } else if (typeof value === 'string') {\n str += ` ${key}: ${value}\\n`;\n }\n }\n return str;\n};\n\n// Subscribe to external events (legacy local events)\neditorEvents.on<Partial<StageStateInterface>>('stage', (event) => {\n const payload = event.payload;\n if (payload.config !== undefined) stageState.config = payload.config;\n if (payload.backgroundColor !== undefined) stageState.backgroundColor = payload.backgroundColor;\n if (payload.backgroundImage !== undefined) stageState.backgroundImage = payload.backgroundImage;\n if (payload.inputs !== undefined) stageState.inputs = payload.inputs;\n if (payload.variables !== undefined) stageState.variables = payload.variables;\n if (payload.gravity !== undefined) stageState.gravity = payload.gravity;\n if (payload.entities !== undefined) stageState.entities = payload.entities;\n});\n\n// Subscribe to entity-specific updates\neditorEvents.on<BaseEntityInterface[]>('entities', (event) => {\n stageState.entities = event.payload;\n});\n\n// Stage snapshots and entity upserts/thumbnails/removals arrive through the\n// typed bridge — see src/bridge/editor-bridge.ts.\n\n","/**\n * SolidJS store for debug UI state.\n * Syncs with the valtio-based debug-state for reactivity in Solid components.\n * Persists layout state to localStorage.\n */\n\nimport { createStore } from 'solid-js/store';\nimport { subscribe } from 'valtio/vanilla';\nimport { debugState, type DebugTools } from './entities/entities-state';\nimport {\n\tcreateEmptyDockRegistry,\n\tfindDockedSide,\n\tinsertIntoZone,\n\tnormalizeDockRegistry,\n\tremoveFromZones,\n\ttype DockPanelId,\n\ttype DockRegistry,\n\ttype DockSide,\n} from './common/dock-layout';\n\n// localStorage key for persisted state\nconst STORAGE_KEY = 'zylem-editor-state';\n\n/** Registry id of the main editor panel; detached sections use their panel id. */\nexport const MAIN_PANEL_ID = 'main';\n\n// Default panel order\nconst DEFAULT_PANEL_ORDER = ['game-config', 'stage-config', 'entities', 'console', 'bridge'];\n\n/**\n * Merge panels added since a user's layout was persisted. Without this, an\n * existing localStorage `panelOrder` would permanently hide new panels.\n */\nconst withNewPanels = (stored: string[] | undefined): string[] => {\n\tif (!stored) return [...DEFAULT_PANEL_ORDER];\n\tconst missing = DEFAULT_PANEL_ORDER.filter((id) => !stored.includes(id));\n\treturn missing.length > 0 ? [...stored, ...missing] : stored;\n};\n\nexport interface DetachedPanelState {\n\tposition: { x: number; y: number };\n\tsize: { width: number; height: number };\n}\n\n/** First-run dock assignments a host can request; see `applyDefaultDocks`. */\nexport type EditorDockDefaults = Partial<Record<DockSide, DockPanelId[]>>;\n\n// State that gets persisted to localStorage\ninterface PersistedState {\n\tpanelPosition: { x: number; y: number } | null;\n\tpanelSize: { width: number; height: number } | null;\n\ttoggleButtonPosition: { x: number; y: number };\n\tpanelOrder: string[];\n\tdetachedPanels: Record<string, DetachedPanelState>;\n\topenSections: string[];\n\tpanelZOrder: string[];\n\tdocks: DockRegistry;\n\tdockDefaultsApplied: boolean;\n}\n\n// Load persisted state from localStorage\nconst loadPersistedState = (): Partial<PersistedState> => {\n\tif (typeof window === 'undefined') return {};\n\ttry {\n\t\tconst stored = localStorage.getItem(STORAGE_KEY);\n\t\tif (stored) {\n\t\t\treturn JSON.parse(stored);\n\t\t}\n\t} catch (e) {\n\t\tconsole.warn('Failed to load editor state from localStorage:', e);\n\t}\n\treturn {};\n};\n\n// Save state to localStorage\nconst savePersistedState = (state: PersistedState) => {\n\tif (typeof window === 'undefined') return;\n\ttry {\n\t\tlocalStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n\t} catch (e) {\n\t\tconsole.warn('Failed to save editor state to localStorage:', e);\n\t}\n};\n\n// Load initial state\nconst persisted = loadPersistedState();\n\nexport const [debugStore, setDebugStore] = createStore({\n\tdebug: false,\n\ttool: 'none' as DebugTools,\n\tpaused: false,\n\thovered: null as string | null,\n\tselected: [] as string[],\n\t/** Fallback target for the gizmo tools; see `DebugState.lastTouchedEntityId`. */\n\tlastTouched: null as string | null,\n\tpanelPosition: persisted.panelPosition ?? null,\n\t/** Main panel's floating size; its docked size comes from the registry. */\n\tpanelSize: persisted.panelSize ?? null,\n\ttoggleButtonPosition: persisted.toggleButtonPosition ?? { x: 0, y: 0 },\n\t// Detachable panel state\n\tpanelOrder: withNewPanels(persisted.panelOrder),\n\tdetachedPanels: persisted.detachedPanels ?? {} as Record<string, DetachedPanelState>,\n\topenSections: persisted.openSections ?? ['console'],\n\t// Z-index ordering (last item = on top)\n\tpanelZOrder: persisted.panelZOrder ?? [],\n\t// Which panels are docked to which viewport edge, and how thick each edge is\n\tdocks: normalizeDockRegistry(persisted.docks),\n\tdockDefaultsApplied: persisted.dockDefaultsApplied ?? false,\n\t// Drag-to-reattach state (not persisted)\n\tdraggingPanelId: null as string | null,\n\tdropTargetIndex: null as number | null,\n});\n\n// Helper to save current persisted state\nconst persistState = () => {\n\tsavePersistedState({\n\t\tpanelPosition: debugStore.panelPosition,\n\t\tpanelSize: debugStore.panelSize,\n\t\ttoggleButtonPosition: debugStore.toggleButtonPosition,\n\t\tpanelOrder: debugStore.panelOrder,\n\t\tdetachedPanels: debugStore.detachedPanels,\n\t\topenSections: debugStore.openSections,\n\t\tpanelZOrder: debugStore.panelZOrder,\n\t\tdocks: debugStore.docks,\n\t\tdockDefaultsApplied: debugStore.dockDefaultsApplied,\n\t});\n};\n\n// Panel position actions\nexport const setPanelPosition = (pos: { x: number; y: number }) => {\n\tsetDebugStore('panelPosition', pos);\n\tpersistState();\n};\n\nexport const setPanelSize = (size: { width: number; height: number }) => {\n\tsetDebugStore('panelSize', size);\n\tpersistState();\n};\n\nexport const setToggleButtonPosition = (pos: { x: number; y: number }) => {\n\tsetDebugStore('toggleButtonPosition', pos);\n\tpersistState();\n};\n\n// Detachable panel actions\nexport const detachPanel = (panelId: string, position: { x: number; y: number }) => {\n\tsetDebugStore('detachedPanels', panelId, {\n\t\tposition,\n\t\tsize: { width: 350, height: 300 },\n\t});\n\t// Remove from open sections since it's now floating\n\tsetDebugStore('openSections', (sections) => sections.filter((s) => s !== panelId));\n\t// Add to z-order (on top)\n\tsetDebugStore('panelZOrder', [...debugStore.panelZOrder.filter((id) => id !== panelId), panelId]);\n\tpersistState();\n};\n\nexport const reattachPanel = (panelId: string, insertIndex?: number) => {\n\t// Remove from detached panels\n\tsetDebugStore('detachedPanels', panelId, undefined!);\n\t// Remove from z-order\n\tsetDebugStore('panelZOrder', debugStore.panelZOrder.filter((id) => id !== panelId));\n\t// A panel living back in the accordion can't also hold a dock slot.\n\tsetDebugStore('docks', removeFromZones(debugStore.docks, panelId));\n\n\t// Add back to panel order if not already present\n\tconst currentOrder = debugStore.panelOrder;\n\tif (!currentOrder.includes(panelId)) {\n\t\tif (insertIndex !== undefined) {\n\t\t\tsetDebugStore('panelOrder', [...currentOrder.slice(0, insertIndex), panelId, ...currentOrder.slice(insertIndex)]);\n\t\t} else {\n\t\t\tsetDebugStore('panelOrder', [...currentOrder, panelId]);\n\t\t}\n\t}\n\tpersistState();\n};\n\nexport const bringPanelToFront = (panelId: string) => {\n\t// Move panel to end of z-order (highest z-index)\n\tsetDebugStore('panelZOrder', [...debugStore.panelZOrder.filter((id) => id !== panelId), panelId]);\n\tpersistState();\n};\n\nexport const updateDetachedPanelPosition = (panelId: string, position: { x: number; y: number }) => {\n\tsetDebugStore('detachedPanels', panelId, 'position', position);\n\tpersistState();\n};\n\nexport const updateDetachedPanelSize = (panelId: string, size: { width: number; height: number }) => {\n\tsetDebugStore('detachedPanels', panelId, 'size', size);\n\tpersistState();\n};\n\nexport const reorderPanels = (newOrder: string[]) => {\n\tsetDebugStore('panelOrder', newOrder);\n\tpersistState();\n};\n\nexport const setOpenSections = (sections: string[]) => {\n\tsetDebugStore('openSections', sections);\n\tpersistState();\n};\n\nexport const isPanelDetached = (panelId: string): boolean => {\n\treturn panelId in debugStore.detachedPanels;\n};\n\n// Dock registry actions. Rects are derived from this by `computeDockLayout`,\n// so moving a panel between zones relayouts every other docked panel too.\nexport const dockPanelToSide = (\n\tpanelId: DockPanelId,\n\tside: DockSide,\n\tindex?: number,\n) => {\n\tsetDebugStore('docks', insertIntoZone(debugStore.docks, panelId, side, index));\n\tpersistState();\n};\n\nexport const undockPanelFromSides = (panelId: DockPanelId) => {\n\tif (!findDockedSide(debugStore.docks, panelId)) return;\n\tsetDebugStore('docks', removeFromZones(debugStore.docks, panelId));\n\tpersistState();\n};\n\nexport const setDockThickness = (side: DockSide, thickness: number) => {\n\tsetDebugStore('docks', side, 'thickness', Math.max(1, Math.round(thickness)));\n\tpersistState();\n};\n\nexport const getDockedSide = (panelId: DockPanelId): DockSide | null =>\n\tfindDockedSide(debugStore.docks, panelId);\n\n/**\n * Seed a host's preferred dock layout the first time the editor runs.\n *\n * Sections named here are pulled out of the accordion first, since only a\n * detached section can hold a dock slot. Guarded by `dockDefaultsApplied` so a\n * returning user's own layout is never overwritten.\n */\nexport const applyDefaultDocks = (defaults: EditorDockDefaults | undefined) => {\n\tif (!defaults || debugStore.dockDefaultsApplied) return;\n\n\tlet docks = createEmptyDockRegistry();\n\tlet seeded = false;\n\n\tfor (const side of ['left', 'right', 'top', 'bottom'] as const) {\n\t\tfor (const panelId of defaults[side] ?? []) {\n\t\t\tif (panelId !== MAIN_PANEL_ID && !isPanelDetached(panelId)) {\n\t\t\t\tsetDebugStore('detachedPanels', panelId, {\n\t\t\t\t\tposition: { x: 100, y: 100 },\n\t\t\t\t\tsize: { width: 350, height: 300 },\n\t\t\t\t});\n\t\t\t\tsetDebugStore('openSections', (sections) => sections.filter((s) => s !== panelId));\n\t\t\t\tsetDebugStore('panelZOrder', [\n\t\t\t\t\t...debugStore.panelZOrder.filter((id) => id !== panelId),\n\t\t\t\t\tpanelId,\n\t\t\t\t]);\n\t\t\t}\n\t\t\tdocks = insertIntoZone(docks, panelId, side);\n\t\t\tseeded = true;\n\t\t}\n\t}\n\n\tif (seeded) {\n\t\tsetDebugStore('docks', docks);\n\t}\n\tsetDebugStore('dockDefaultsApplied', true);\n\tpersistState();\n};\n\n// Drag-to-reattach state management (not persisted)\nexport const setDraggingPanel = (panelId: string | null) => {\n\tsetDebugStore('draggingPanelId', panelId);\n};\n\nexport const setDropTargetIndex = (index: number | null) => {\n\tsetDebugStore('dropTargetIndex', index);\n};\n\nexport const clearDragState = () => {\n\tsetDebugStore('draggingPanelId', null);\n\tsetDebugStore('dropTargetIndex', null);\n};\n\n// Sync valtio state to SolidJS store (not persisted - these are runtime state)\nsubscribe(debugState, () => {\n\tsetDebugStore('tool', debugState.tool);\n\tsetDebugStore('paused', debugState.paused);\n\tsetDebugStore('hovered', debugState.hoveredEntityId);\n\tsetDebugStore('selected', debugState.selectedEntityId ? [debugState.selectedEntityId] : []);\n\tsetDebugStore('lastTouched', debugState.lastTouchedEntityId);\n});\n\n","/**\n * Dock layout geometry.\n *\n * Docking used to be per-panel: each panel snapped itself to a viewport edge\n * and sized itself from `window.innerWidth`. That cannot express two panels\n * sharing a side, or a bottom strip that stops at a left-docked panel, so the\n * dock state lives in one registry (persisted in the editor store) and every\n * panel's rect comes from `computeDockLayout`.\n *\n * This module is deliberately free of Solid and `window` so the geometry can\n * be unit tested directly.\n */\n\nexport type DockSide = 'left' | 'right' | 'top' | 'bottom';\n\n/** `'main'` is the editor panel; any other id is a detached section id. */\nexport type DockPanelId = string;\n\nexport interface DockZoneState {\n\t/** Occupants in slot order along the zone's long axis. */\n\tpanels: DockPanelId[];\n\t/**\n\t * Width for left/right, height for top/bottom.\n\t * `0` means \"not chosen yet\"; the layout falls back to a viewport quarter.\n\t */\n\tthickness: number;\n}\n\nexport type DockRegistry = Record<DockSide, DockZoneState>;\n\nexport interface Viewport {\n\twidth: number;\n\theight: number;\n}\n\nexport interface DockRect {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\nexport const DOCK_SIDES: readonly DockSide[] = ['left', 'right', 'top', 'bottom'];\n\n/** Keeps at least a sliver of the game visible between opposing docks. */\nexport const MIN_FREE_SPACE = 80;\n\n/** Left and right zones are sized along x; top and bottom along y. */\nexport const isHorizontalSide = (side: DockSide): boolean =>\n\tside === 'left' || side === 'right';\n\n/**\n * The edge a docked panel exposes to the rest of the viewport. Dragging it\n * resizes the zone instead of undocking the panel.\n */\nexport const innerEdgeFor = (side: DockSide): 'e' | 'w' | 's' | 'n' => {\n\tswitch (side) {\n\t\tcase 'left':\n\t\t\treturn 'e';\n\t\tcase 'right':\n\t\t\treturn 'w';\n\t\tcase 'top':\n\t\t\treturn 's';\n\t\tdefault:\n\t\t\treturn 'n';\n\t}\n};\n\nexport const createEmptyDockRegistry = (): DockRegistry => ({\n\tleft: { panels: [], thickness: 0 },\n\tright: { panels: [], thickness: 0 },\n\ttop: { panels: [], thickness: 0 },\n\tbottom: { panels: [], thickness: 0 },\n});\n\n/** Repairs partial or malformed registries coming out of localStorage. */\nexport const normalizeDockRegistry = (value: unknown): DockRegistry => {\n\tconst registry = createEmptyDockRegistry();\n\tif (!value || typeof value !== 'object') return registry;\n\n\tconst seen = new Set<DockPanelId>();\n\tfor (const side of DOCK_SIDES) {\n\t\tconst zone = (value as Record<string, unknown>)[side];\n\t\tif (!zone || typeof zone !== 'object') continue;\n\n\t\tconst panels = (zone as { panels?: unknown }).panels;\n\t\tif (Array.isArray(panels)) {\n\t\t\tfor (const id of panels) {\n\t\t\t\t// A panel can only occupy one slot; drop duplicates rather than\n\t\t\t\t// rendering the same panel in two zones.\n\t\t\t\tif (typeof id !== 'string' || id.length === 0 || seen.has(id)) continue;\n\t\t\t\tseen.add(id);\n\t\t\t\tregistry[side].panels.push(id);\n\t\t\t}\n\t\t}\n\n\t\tconst thickness = (zone as { thickness?: unknown }).thickness;\n\t\tif (typeof thickness === 'number' && Number.isFinite(thickness) && thickness > 0) {\n\t\t\tregistry[side].thickness = thickness;\n\t\t}\n\t}\n\n\treturn registry;\n};\n\nexport const findDockedSide = (\n\tregistry: DockRegistry,\n\tpanelId: DockPanelId,\n): DockSide | null =>\n\tDOCK_SIDES.find((side) => registry[side].panels.includes(panelId)) ?? null;\n\nexport const isDocked = (registry: DockRegistry, panelId: DockPanelId): boolean =>\n\tfindDockedSide(registry, panelId) !== null;\n\nconst cloneRegistry = (registry: DockRegistry): DockRegistry => {\n\tconst next = createEmptyDockRegistry();\n\tfor (const side of DOCK_SIDES) {\n\t\tnext[side] = {\n\t\t\tpanels: [...registry[side].panels],\n\t\t\tthickness: registry[side].thickness,\n\t\t};\n\t}\n\treturn next;\n};\n\nexport const removeFromZones = (\n\tregistry: DockRegistry,\n\tpanelId: DockPanelId,\n): DockRegistry => {\n\tconst next = cloneRegistry(registry);\n\tfor (const side of DOCK_SIDES) {\n\t\tnext[side].panels = next[side].panels.filter((id) => id !== panelId);\n\t}\n\treturn next;\n};\n\n/**\n * Move `panelId` into `side` at `index`, removing it from wherever it was.\n * Omitting `index` appends.\n */\nexport const insertIntoZone = (\n\tregistry: DockRegistry,\n\tpanelId: DockPanelId,\n\tside: DockSide,\n\tindex?: number,\n): DockRegistry => {\n\tconst next = removeFromZones(registry, panelId);\n\tconst panels = next[side].panels;\n\tconst target = index === undefined ? panels.length : Math.max(0, Math.min(index, panels.length));\n\tpanels.splice(target, 0, panelId);\n\treturn next;\n};\n\nconst zoneViewportExtent = (side: DockSide, viewport: Viewport): number =>\n\tisHorizontalSide(side) ? viewport.width : viewport.height;\n\n/**\n * Resolved thickness for a zone: the stored value, or a quarter of the\n * viewport when the user has never sized it.\n */\nexport const resolveThickness = (\n\tregistry: DockRegistry,\n\tside: DockSide,\n\tviewport: Viewport,\n): number => {\n\tif (registry[side].panels.length === 0) return 0;\n\tconst extent = zoneViewportExtent(side, viewport);\n\tconst stored = registry[side].thickness;\n\tconst thickness = stored > 0 ? stored : Math.round(extent / 4);\n\treturn Math.max(1, Math.min(thickness, extent));\n};\n\n/**\n * Clamp a proposed zone thickness so the panel stays usable and the opposing\n * zone keeps room. `minThickness` is the largest minimum among the occupants.\n */\nexport const clampThickness = (\n\tregistry: DockRegistry,\n\tside: DockSide,\n\tthickness: number,\n\tviewport: Viewport,\n\tminThickness: number,\n): number => {\n\tconst extent = zoneViewportExtent(side, viewport);\n\tconst opposite = side === 'left' ? 'right' : side === 'right' ? 'left' : side === 'top' ? 'bottom' : 'top';\n\tconst opposingThickness = resolveThickness(registry, opposite, viewport);\n\tconst max = Math.max(1, extent - opposingThickness - MIN_FREE_SPACE);\n\tconst min = Math.max(1, Math.min(minThickness, max));\n\treturn Math.round(Math.max(min, Math.min(thickness, max)));\n};\n\n/**\n * Slice a zone's long axis into `count` even slots, honouring `minSlot`.\n * A crowded zone overflows rather than shrinking slots to nothing.\n */\nconst slotExtents = (total: number, count: number, minSlot: number): number[] => {\n\tif (count <= 0) return [];\n\tconst even = total / count;\n\tconst extent = Math.max(minSlot, even);\n\treturn Array.from({ length: count }, () => extent);\n};\n\nexport interface DockLayoutOptions {\n\t/** Smallest slot extent along a zone's long axis. */\n\tminSlotExtent?: number;\n}\n\n/**\n * Rect for every docked panel.\n *\n * Left and right zones take the full viewport height and win over top and\n * bottom, which inset horizontally to the space between them. Panels sharing a\n * zone split its long axis evenly.\n */\nexport const computeDockLayout = (\n\tregistry: DockRegistry,\n\tviewport: Viewport,\n\toptions: DockLayoutOptions = {},\n): Record<DockPanelId, DockRect> => {\n\tconst minSlot = options.minSlotExtent ?? 0;\n\tconst layout: Record<DockPanelId, DockRect> = {};\n\n\tconst leftThickness = resolveThickness(registry, 'left', viewport);\n\tconst rightThickness = resolveThickness(registry, 'right', viewport);\n\tconst topThickness = resolveThickness(registry, 'top', viewport);\n\tconst bottomThickness = resolveThickness(registry, 'bottom', viewport);\n\n\t// Side zones own the full height.\n\tfor (const side of ['left', 'right'] as const) {\n\t\tconst panels = registry[side].panels;\n\t\tif (panels.length === 0) continue;\n\t\tconst width = side === 'left' ? leftThickness : rightThickness;\n\t\tconst x = side === 'left' ? 0 : Math.max(0, viewport.width - width);\n\t\tconst extents = slotExtents(viewport.height, panels.length, minSlot);\n\t\tlet y = 0;\n\t\tpanels.forEach((panelId, index) => {\n\t\t\tlayout[panelId] = { x, y, width, height: extents[index]! };\n\t\t\ty += extents[index]!;\n\t\t});\n\t}\n\n\t// Top and bottom fill only what the side zones leave behind.\n\tconst insetX = leftThickness;\n\tconst insetWidth = Math.max(1, viewport.width - leftThickness - rightThickness);\n\tfor (const side of ['top', 'bottom'] as const) {\n\t\tconst panels = registry[side].panels;\n\t\tif (panels.length === 0) continue;\n\t\tconst height = side === 'top' ? topThickness : bottomThickness;\n\t\tconst y = side === 'top' ? 0 : Math.max(0, viewport.height - height);\n\t\tconst extents = slotExtents(insetWidth, panels.length, minSlot);\n\t\tlet x = insetX;\n\t\tpanels.forEach((panelId, index) => {\n\t\t\tlayout[panelId] = { x, y, width: extents[index]!, height };\n\t\t\tx += extents[index]!;\n\t\t});\n\t}\n\n\treturn layout;\n};\n\n/**\n * Where a panel would land if dropped on `side`, from the pointer's position\n * along the zone's long axis compared against the existing slot midpoints.\n * Mirrors the accordion's drop-index behaviour.\n */\nexport const dockSlotIndex = (\n\tregistry: DockRegistry,\n\tside: DockSide,\n\tpointer: { x: number; y: number },\n\tviewport: Viewport,\n\tpanelId?: DockPanelId,\n): number => {\n\t// Ignore the dragged panel's own slot so hovering its current spot is a no-op.\n\tconst withoutPanel = panelId ? removeFromZones(registry, panelId) : registry;\n\tconst occupants = withoutPanel[side].panels;\n\tif (occupants.length === 0) return 0;\n\n\tconst layout = computeDockLayout(withoutPanel, viewport);\n\tconst alongY = isHorizontalSide(side);\n\tlet index = 0;\n\toccupants.forEach((occupantId, slot) => {\n\t\tconst rect = layout[occupantId];\n\t\tif (!rect) return;\n\t\tconst middle = alongY ? rect.y + rect.height / 2 : rect.x + rect.width / 2;\n\t\tconst position = alongY ? pointer.y : pointer.x;\n\t\tif (position > middle) index = slot + 1;\n\t});\n\treturn index;\n};\n\n/** Rect a panel would occupy if docked to `side` at `index`, for the drag preview. */\nexport const previewDockRect = (\n\tregistry: DockRegistry,\n\tpanelId: DockPanelId,\n\tside: DockSide,\n\tindex: number,\n\tviewport: Viewport,\n\toptions?: DockLayoutOptions,\n): DockRect | null => {\n\tconst next = insertIntoZone(registry, panelId, side, index);\n\treturn computeDockLayout(next, viewport, options)[panelId] ?? null;\n};\n","/**\n * EditorContext - SolidJS context for editor state\n * \n * Provides access to debug, game, and stage state throughout the editor component tree.\n */\n\nimport { createContext, useContext, onCleanup, type JSX } from 'solid-js';\nimport { createStore, reconcile } from 'solid-js/store';\nimport { subscribe } from 'valtio/vanilla';\nimport { debugState, type DebugState } from './entities/entities-state';\nimport { gameState, type GameState } from './game/game-state';\nimport { stageState } from './stages/stage-state';\nimport type { StageStateInterface } from '../types';\n\nexport interface EditorContextValue {\n\tdebug: DebugState;\n\tgame: GameState;\n\tstage: StageStateInterface;\n}\n\nconst EditorContext = createContext<EditorContextValue>();\n\nexport interface EditorProviderProps {\n\tchildren: JSX.Element;\n}\n\n/**\n * EditorProvider wraps the editor UI and provides access to all editor state.\n */\nexport function EditorProvider(props: EditorProviderProps) {\n\t// Create SolidJS stores from valtio proxies\n\tconst [debug, setDebug] = createStore<DebugState>({ ...debugState });\n\tconst [game, setGame] = createStore<GameState>({ ...gameState });\n\tconst [stage, setStage] = createStore<StageStateInterface>({ ...stageState });\n\n\t// Sync valtio → SolidJS\n\tconst unsubDebug = subscribe(debugState, () => {\n\t\tif (debug.paused !== debugState.paused) {\n\t\t\tsetDebug('paused', debugState.paused);\n\t\t}\n\t\tif (debug.tool !== debugState.tool) {\n\t\t\tsetDebug('tool', debugState.tool);\n\t\t}\n\t\tif (debug.selectedEntityId !== debugState.selectedEntityId) {\n\t\t\tsetDebug('selectedEntityId', debugState.selectedEntityId);\n\t\t}\n\t\tif (debug.hoveredEntityId !== debugState.hoveredEntityId) {\n\t\t\tsetDebug('hoveredEntityId', debugState.hoveredEntityId);\n\t\t}\n\t\t// Sets are mutated in place, so compare contents and copy only when changed.\n\t\tconst nextFlags = debugState.flags;\n\t\tif (\n\t\t\tdebug.flags.size !== nextFlags.size\n\t\t\t|| [...debug.flags].some((flag) => !nextFlags.has(flag))\n\t\t) {\n\t\t\tsetDebug('flags', new Set(nextFlags));\n\t\t}\n\t});\n\n\tconst unsubGame = subscribe(gameState, () => {\n\t\tif (game.id !== gameState.id) {\n\t\t\tsetGame('id', gameState.id);\n\t\t}\n\t\tif (game.time !== gameState.time) {\n\t\t\tsetGame('time', gameState.time);\n\t\t}\n\t\tsetGame('globals', reconcile(gameState.globals));\n\t\tif (gameState.config === null) {\n\t\t\tif (game.config !== null) {\n\t\t\t\tsetGame('config', null);\n\t\t\t}\n\t\t} else {\n\t\t\tsetGame('config', reconcile(gameState.config));\n\t\t}\n\t});\n\n\tconst unsubStage = subscribe(stageState, () => {\n\t\tif (stageState.config === null) {\n\t\t\tif (stage.config !== null) {\n\t\t\t\tsetStage('config', null);\n\t\t\t}\n\t\t} else {\n\t\t\tsetStage('config', reconcile(stageState.config));\n\t\t}\n\t\tif (stage.backgroundColor !== stageState.backgroundColor) {\n\t\t\tsetStage('backgroundColor', stageState.backgroundColor);\n\t\t}\n\t\tif (stage.backgroundImage !== stageState.backgroundImage) {\n\t\t\tsetStage('backgroundImage', stageState.backgroundImage);\n\t\t}\n\t\tsetStage('inputs', reconcile(stageState.inputs));\n\t\tsetStage('variables', reconcile(stageState.variables));\n\t\tsetStage('gravity', reconcile(stageState.gravity));\n\t\t// Key by uuid so reconcile matches entities by identity rather than\n\t\t// array position; without it, removing one entity re-diffs every entry\n\t\t// after it.\n\t\tsetStage('entities', reconcile(stageState.entities, { key: 'uuid' }));\n\t});\n\n\tonCleanup(() => {\n\t\tunsubDebug();\n\t\tunsubGame();\n\t\tunsubStage();\n\t});\n\n\tconst value: EditorContextValue = {\n\t\tdebug,\n\t\tgame,\n\t\tstage,\n\t};\n\n\treturn (\n\t\t<EditorContext.Provider value={value}>\n\t\t\t{props.children}\n\t\t</EditorContext.Provider>\n\t);\n}\n\n/**\n * Hook to access editor state from any component within EditorProvider.\n */\nexport function useEditor(): EditorContextValue {\n\tconst context = useContext(EditorContext);\n\tif (!context) {\n\t\tthrow new Error('useEditor must be used within an EditorProvider');\n\t}\n\treturn context;\n}\n","import { proxy } from 'valtio/vanilla';\n\n/**\n * Console state for managing debug console messages\n */\nexport const consoleState = proxy({\n\tmessages: [] as string[],\n});\n\n/**\n * Maximum retained console lines. The console is a ring buffer because a\n * chatty game can print continuously, and an unbounded array would grow the\n * proxy (and the string rebuilt for display) without limit.\n */\nexport const MAX_CONSOLE_MESSAGES = 500;\n\n/**\n * Append a message to the debug console\n * @param message The message to append to the console\n */\nexport const printToConsole = (message: string) => {\n\tconst timestamp = new Date().toLocaleTimeString();\n\tconst formattedMessage = `[${timestamp}] ${message}`;\n\tconsoleState.messages.push(formattedMessage);\n\tif (consoleState.messages.length > MAX_CONSOLE_MESSAGES) {\n\t\tconsoleState.messages.splice(\n\t\t\t0,\n\t\t\tconsoleState.messages.length - MAX_CONSOLE_MESSAGES,\n\t\t);\n\t}\n};\n\n/**\n * Clear all messages from the debug console\n */\nexport const clearConsole = () => {\n\tconsoleState.messages = [];\n};\n\n/**\n * Get all console messages as a single string\n */\nexport const getConsoleContent = () => {\n\treturn consoleState.messages.join('\\n');\n}; ","/**\n * State backing the editor's Bridge panel.\n *\n * Mirrors the tracer in `@zylem/bridge` into a valtio proxy the Solid UI can\n * subscribe to. Capture is opt-in and only runs while the panel is mounted, so\n * an unopened panel costs nothing. The event log is a fixed-size ring buffer —\n * bridge traffic can be thousands of messages per minute, and an unbounded log\n * would recreate the very growth problem the panel exists to surface.\n */\n\nimport { proxy } from 'valtio/vanilla';\nimport {\n\tbridgeDebug,\n\tgetZylemBridge,\n\ttype BridgeMessageType,\n\ttype BridgeTraceEvent,\n\ttype BridgeTypeStats,\n} from '@zylem/bridge';\n\n/** Maximum trace rows retained for display. */\nexport const MAX_BRIDGE_LOG_ENTRIES = 200;\n\n/** Dispatch rate (per second) above which a row is flagged as hot. */\nexport const BRIDGE_RATE_WARNING = 60;\n\nexport interface BridgeLogEntry {\n\tid: number;\n\ttime: string;\n\tkind: BridgeTraceEvent['kind'];\n\ttype: string;\n\tbytes: number;\n\tsummary: string;\n}\n\nexport interface BridgeStatsRow extends BridgeTypeStats {\n\t/** Entries the channel is retaining for late-subscriber hydration. */\n\tretained: number;\n}\n\nexport interface BridgePanelState {\n\tcapturing: boolean;\n\tpaused: boolean;\n\tentries: BridgeLogEntry[];\n\tstats: BridgeStatsRow[];\n\t/** Events dropped from the log because the ring buffer was full. */\n\tdropped: number;\n}\n\nexport const bridgePanelState = proxy<BridgePanelState>({\n\tcapturing: false,\n\tpaused: false,\n\tentries: [],\n\tstats: [],\n\tdropped: 0,\n});\n\nlet nextId = 0;\nlet unsubscribeTrace: (() => void) | null = null;\nlet statsTimer: ReturnType<typeof setInterval> | null = null;\n/**\n * Whether this panel turned the shared tracer on. Tracing can also be enabled\n * from the console or `__ZYLEM_BRIDGE_DEBUG__`, and closing the panel must not\n * silently switch that off for the whole page.\n */\nlet enabledTracer = false;\n\nconst formatTime = (t: number): string => {\n\tconst seconds = t / 1_000;\n\treturn `${seconds.toFixed(2)}s`;\n};\n\nfunction refreshStats(): void {\n\tconst { channel } = getZylemBridge();\n\tbridgePanelState.stats = bridgeDebug.stats().map((entry) => ({\n\t\t...entry,\n\t\tretained: channel.retainedSize(entry.type as BridgeMessageType),\n\t}));\n}\n\nfunction record(event: BridgeTraceEvent): void {\n\tif (bridgePanelState.paused) return;\n\t// Deliveries are counted in the stats table; logging each one would flood\n\t// the ring buffer with rows that carry no extra information.\n\tif (event.kind === 'deliver') return;\n\n\tconst entries = bridgePanelState.entries;\n\tentries.push({\n\t\tid: nextId++,\n\t\ttime: formatTime(event.t),\n\t\tkind: event.kind,\n\t\ttype: event.type,\n\t\tbytes: event.bytes,\n\t\tsummary: event.summary,\n\t});\n\tif (entries.length > MAX_BRIDGE_LOG_ENTRIES) {\n\t\tconst overflow = entries.length - MAX_BRIDGE_LOG_ENTRIES;\n\t\tentries.splice(0, overflow);\n\t\tbridgePanelState.dropped += overflow;\n\t}\n}\n\n/**\n * Begin mirroring bridge traffic into the panel, enabling the core tracer if\n * it is not already running.\n *\n * @returns A function that stops capture.\n */\nexport function startBridgeCapture(): () => void {\n\tif (bridgePanelState.capturing) return stopBridgeCapture;\n\tbridgePanelState.capturing = true;\n\n\tenabledTracer = !bridgeDebug.isEnabled();\n\tif (enabledTracer) bridgeDebug.enable();\n\tunsubscribeTrace = bridgeDebug.subscribe(record);\n\trefreshStats();\n\tstatsTimer = setInterval(refreshStats, 500);\n\n\treturn stopBridgeCapture;\n}\n\nexport function stopBridgeCapture(): void {\n\tunsubscribeTrace?.();\n\tunsubscribeTrace = null;\n\tif (statsTimer !== null) {\n\t\tclearInterval(statsTimer);\n\t\tstatsTimer = null;\n\t}\n\t// Only undo what this panel turned on; leave console-enabled tracing alone.\n\tif (enabledTracer) {\n\t\tbridgeDebug.disable();\n\t\tenabledTracer = false;\n\t}\n\tbridgePanelState.capturing = false;\n}\n\nexport function setBridgeCapturePaused(paused: boolean): void {\n\tbridgePanelState.paused = paused;\n}\n\nexport function clearBridgeLog(): void {\n\tbridgePanelState.entries = [];\n\tbridgePanelState.dropped = 0;\n\tbridgeDebug.reset();\n\trefreshStats();\n}\n\n/** Format a byte count for display. */\nexport function formatBytes(bytes: number): string {\n\tif (bytes < 1_024) return `${Math.round(bytes)} B`;\n\tif (bytes < 1_024 * 1_024) return `${(bytes / 1_024).toFixed(1)} KB`;\n\treturn `${(bytes / (1_024 * 1_024)).toFixed(1)} MB`;\n}\n","/**\n * Editor-side adapter for the shared editor ↔ game bridge.\n *\n * Subscribes to game→editor messages and writes them into the editor's\n * valtio stores (`gameState`, `stageState`, editor `debugState`), replacing\n * the old `zylemEventBus.on('state:dispatch', …)` wiring and window\n * CustomEvent listeners. UI actions send typed editor→game commands through\n * the same channel, so the editor has no runtime dependency on game-lib\n * internals.\n *\n * Hydrates from `channel.getState()` on connect, so an editor mounted after\n * the game started shows current config/entities immediately.\n */\n\nimport {\n\tgetZylemBridge,\n\ttype BridgeDebugTool,\n\ttype BridgePose,\n\ttype BridgeQuat,\n\ttype BridgeVec3,\n\ttype EntitySelectionPayload,\n\ttype EntitySummaryPayload,\n\ttype EntityThumbnailPayload,\n\ttype EntityTypeDescriptor,\n\ttype SceneOperationPayload,\n\ttype SnapSettingsPayload,\n\ttype StageSnapshotPayload,\n\ttype GameConfigPayload,\n\ttype GameNoticePayload,\n\ttype GameVariablePayload,\n} from '@zylem/bridge';\n\nimport { gameState } from '../components/game/game-state';\nimport { stageState } from '../components/stages/stage-state';\nimport {\n\tdebugState as editorDebugState,\n\tnoteTouchedEntity,\n} from '../components/entities/entities-state';\nimport { setDebugStore } from '../components/editor-store';\nimport { printToConsole } from '../components/console/console-state';\nimport {\n\tclearEntityThumbnails,\n\tremoveEntityThumbnails,\n\tsetEntityThumbnails,\n} from '../components/entities/thumbnail-store';\nimport { setEntityCatalog } from '../components/toolbar/catalog-state';\nimport { clearHistory, pushOperation } from '../components/history/history-store';\nimport { notifySceneOperation } from '../host/scene-operation-hook';\nimport type { BaseEntityInterface } from '../types';\n\nconst { channel } = getZylemBridge();\n\nlet connected = false;\nlet connectionCount = 0;\nlet unsubscribes: (() => void)[] = [];\n\n/**\n * uuid → index into `stageState.entities`. Kept alongside the array so an\n * upsert is a direct lookup instead of a full scan per message.\n */\nconst entityIndex = new Map<string, number>();\n\nfunction toEntityInterface(payload: EntitySummaryPayload): BaseEntityInterface {\n\tconst entity: BaseEntityInterface = {\n\t\tuuid: payload.uuid,\n\t\tname: payload.name,\n\t\ttype: payload.type,\n\t\tposition: payload.position,\n\t\trotation: payload.rotation,\n\t\tscale: payload.scale,\n\t};\n\tif (payload.bounds) {\n\t\tentity.bounds = payload.bounds;\n\t}\n\treturn entity;\n}\n\n/** Copy changed fields onto an existing entity, leaving untouched ones alone. */\nfunction updateEntityInPlace(\n\ttarget: Partial<BaseEntityInterface>,\n\tpayload: EntitySummaryPayload,\n): void {\n\tif (target.name !== payload.name) target.name = payload.name;\n\tif (target.type !== payload.type) target.type = payload.type;\n\tif (!isSameVec3(target.position, payload.position)) {\n\t\ttarget.position = payload.position;\n\t}\n\tif (!isSameVec3(target.rotation, payload.rotation)) {\n\t\ttarget.rotation = payload.rotation;\n\t}\n\tif (!isSameVec3(target.scale, payload.scale)) {\n\t\ttarget.scale = payload.scale;\n\t}\n\tif (payload.bounds && !isSameBounds(target.bounds, payload.bounds)) {\n\t\ttarget.bounds = payload.bounds;\n\t}\n}\n\nfunction isSameVec3(\n\ta: { x: number; y: number; z: number } | undefined,\n\tb: { x: number; y: number; z: number } | undefined,\n): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\treturn a.x === b.x && a.y === b.y && a.z === b.z;\n}\n\nfunction isSameBounds(\n\ta: { width: number; height: number; depth: number } | undefined,\n\tb: { width: number; height: number; depth: number } | undefined,\n): boolean {\n\tif (a === b) return true;\n\tif (!a || !b) return false;\n\treturn a.width === b.width && a.height === b.height && a.depth === b.depth;\n}\n\n/**\n * Apply the display config, writing only the fields that changed. The game's\n * `ResizeObserver` republishes on every layout tick, and assigning a fresh\n * object each time would invalidate every consumer of `gameState.config`.\n */\nfunction applyGameConfig(config: GameConfigPayload): void {\n\tif (gameState.id !== config.id) {\n\t\tgameState.id = config.id;\n\t}\n\n\tconst current = gameState.config;\n\tif (!current) {\n\t\tgameState.config = {\n\t\t\tid: config.id,\n\t\t\taspectRatio: config.aspectRatio,\n\t\t\tfullscreen: config.fullscreen,\n\t\t\tbodyBackground: config.bodyBackground,\n\t\t\tinternalResolution: config.internalResolution,\n\t\t\tdebug: config.debug,\n\t\t};\n\t\treturn;\n\t}\n\n\tif (current.id !== config.id) current.id = config.id;\n\tif (current.aspectRatio !== config.aspectRatio) {\n\t\tcurrent.aspectRatio = config.aspectRatio;\n\t}\n\tif (current.fullscreen !== config.fullscreen) {\n\t\tcurrent.fullscreen = config.fullscreen;\n\t}\n\tif (current.bodyBackground !== config.bodyBackground) {\n\t\tcurrent.bodyBackground = config.bodyBackground;\n\t}\n\tif (current.debug !== config.debug) current.debug = config.debug;\n\n\tconst nextResolution = config.internalResolution;\n\tconst currentResolution = current.internalResolution;\n\tconst resolutionChanged =\n\t\t(!nextResolution || !currentResolution)\n\t\t\t? nextResolution !== currentResolution\n\t\t\t: nextResolution.width !== currentResolution.width\n\t\t\t|| nextResolution.height !== currentResolution.height;\n\tif (resolutionChanged) {\n\t\tcurrent.internalResolution = nextResolution;\n\t}\n}\n\nfunction applyGameVariable(payload: GameVariablePayload): void {\n\tgameState.globals[payload.path] = payload.value;\n}\n\nfunction applyStageSnapshot(snapshot: StageSnapshotPayload): void {\n\tif (snapshot.stage) {\n\t\tstageState.config = {\n\t\t\tid: snapshot.stage.id,\n\t\t\tbackgroundColor: snapshot.stage.backgroundColor,\n\t\t\tbackgroundImage: snapshot.stage.backgroundImage,\n\t\t\tgravity: snapshot.stage.gravity,\n\t\t\tinputs: snapshot.stage.inputs,\n\t\t\tvariables: snapshot.stage.variables,\n\t\t};\n\t\tstageState.backgroundColor = snapshot.stage.backgroundColor;\n\t\tstageState.backgroundImage = snapshot.stage.backgroundImage;\n\t\tstageState.gravity = snapshot.stage.gravity;\n\t\tstageState.inputs = snapshot.stage.inputs;\n\t\tstageState.variables = snapshot.stage.variables;\n\t} else {\n\t\t// A null stage means \"no stage loaded\". Leaving the previous config in\n\t\t// place would show the old stage's background, gravity, and variables\n\t\t// next to an entity list from a different context.\n\t\tstageState.config = null;\n\t\tstageState.backgroundColor = null;\n\t\tstageState.backgroundImage = null;\n\t\tstageState.gravity = { x: 0, y: 0, z: 0 };\n\t\tstageState.inputs = {};\n\t\tstageState.variables = {};\n\t}\n\tstageState.entities = snapshot.entities.map(toEntityInterface);\n\tentityIndex.clear();\n\tstageState.entities.forEach((entity, index) => {\n\t\tif (entity.uuid) entityIndex.set(entity.uuid, index);\n\t});\n\tclearEntityThumbnails();\n\tadoptInlineThumbnails(snapshot.entities);\n\t// A new stage means every uuid in the history stack is dangling, so replaying\n\t// an entry would either no-op or hit an unrelated entity.\n\tclearHistory();\n}\n\n/**\n * Route thumbnails that arrived inline on an entity summary into the\n * side-channel store, so every consumer reads them from one place.\n */\nfunction adoptInlineThumbnails(entities: EntitySummaryPayload[]): void {\n\tconst inline = entities\n\t\t.filter((payload) => Boolean(payload.thumbnail))\n\t\t.map((payload) => ({\n\t\t\tuuid: payload.uuid,\n\t\t\turl: payload.thumbnail as string,\n\t\t\tbounds: payload.bounds,\n\t\t}));\n\tif (inline.length > 0) setEntityThumbnails(inline);\n}\n\n/**\n * Merge entity updates by mutating changed entries in place. Replacing the\n * whole array on every message made each upsert cost O(entities) and forced\n * `reconcile` to re-diff the entire list, which is what turned a spawn-heavy\n * game into a frozen tab.\n */\nfunction applyEntityUpsert(entities: EntitySummaryPayload[]): void {\n\tconst current = stageState.entities;\n\tfor (const payload of entities) {\n\t\tconst index = entityIndex.get(payload.uuid);\n\t\tconst existing = index === undefined ? undefined : current[index];\n\t\tif (!existing) {\n\t\t\tentityIndex.set(payload.uuid, current.length);\n\t\t\tcurrent.push(toEntityInterface(payload));\n\t\t} else {\n\t\t\tupdateEntityInPlace(existing, payload);\n\t\t}\n\t}\n\tadoptInlineThumbnails(entities);\n}\n\nfunction applyEntityRemoved(uuids: string[]): void {\n\t// Release thumbnails first, and unconditionally: a thumbnail can arrive\n\t// for an entity that never made it into the list (or already left it), and\n\t// its blob URL would otherwise be held until the next stage snapshot.\n\tremoveEntityThumbnails(uuids);\n\n\tconst removed = new Set(uuids);\n\tconst current = stageState.entities;\n\t// Compact in place, then rebuild the index for the shifted positions.\n\tlet write = 0;\n\tfor (let read = 0; read < current.length; read += 1) {\n\t\tconst entity = current[read]!;\n\t\tif (entity.uuid && removed.has(entity.uuid)) continue;\n\t\tcurrent[write] = entity;\n\t\twrite += 1;\n\t}\n\tif (write === current.length) return;\n\n\tcurrent.length = write;\n\tentityIndex.clear();\n\tcurrent.forEach((entity, index) => {\n\t\tif (entity.uuid) entityIndex.set(entity.uuid, index);\n\t});\n}\n\nfunction applyThumbnails(thumbnails: EntityThumbnailPayload[]): void {\n\tsetEntityThumbnails(thumbnails);\n}\n\nfunction applyGameStatus(status: { paused?: boolean; debug?: boolean }): void {\n\tif (status.paused !== undefined) {\n\t\teditorDebugState.paused = status.paused;\n\t\tsetDebugStore('paused', status.paused);\n\t}\n\tif (status.debug !== undefined) {\n\t\tsetDebugStore('debug', status.debug);\n\t}\n}\n\nfunction applyEntitySelection(selection: EntitySelectionPayload): void {\n\teditorDebugState.selectedEntityId = selection.selectedUuid;\n\teditorDebugState.hoveredEntityId = selection.hoveredUuid;\n\teditorDebugState.selectedEntityIds =\n\t\tselection.selectedUuids\n\t\t?? (selection.selectedUuid ? [selection.selectedUuid] : []);\n\t// Written field by field rather than through `setSelectedEntityId`, so the\n\t// in-scene Select tool's picks have to be recorded here too.\n\tnoteTouchedEntity(selection.selectedUuid);\n}\n\nfunction applyCatalog(payload: { entities: EntityTypeDescriptor[] }): void {\n\tsetEntityCatalog(payload.entities);\n}\n\n/** Record a committed game-side edit, and let the host observe it. */\nfunction applySceneOperation(op: SceneOperationPayload): void {\n\t// Placement leaves the new entity unselected, so this is the only signal that\n\t// it is now the thing being worked on. Undo of the create is not unwound here:\n\t// the entity simply stops existing, and the gizmo tools check for that.\n\tif (op.kind === 'create') {\n\t\tnoteTouchedEntity(op.entries.at(-1)?.uuid ?? null);\n\t}\n\tpushOperation(op);\n\tnotifySceneOperation(op);\n}\n\nfunction applyGameNotice(notice: GameNoticePayload): void {\n\tprintToConsole(`[${notice.level}] ${notice.message}`);\n}\n\n/**\n * Subscribe the editor stores to game→editor bridge messages and hydrate\n * from the channel's retained state.\n *\n * Reference-counted: the game gates expensive editor-only work (thumbnails,\n * entity summaries) on these subscriptions existing, so the last editor to\n * unmount must actually release them, while any editor still mounted must\n * keep them alive.\n *\n * @returns A release function; safe to call more than once.\n */\nexport function connectEditorBridge(): () => void {\n\tconnectionCount += 1;\n\tlet released = false;\n\tconst release = () => {\n\t\tif (released) return;\n\t\treleased = true;\n\t\tconnectionCount -= 1;\n\t\tif (connectionCount <= 0) {\n\t\t\tconnectionCount = 0;\n\t\t\tdisconnectEditorBridge();\n\t\t}\n\t};\n\n\tif (connected) return release;\n\tconnected = true;\n\n\tunsubscribes = [\n\t\tchannel.on('game:config', applyGameConfig),\n\t\tchannel.on('game:variable', applyGameVariable),\n\t\tchannel.on('game:status', applyGameStatus),\n\t\tchannel.on('stage:snapshot', applyStageSnapshot),\n\t\tchannel.on('entity:upsert', applyEntityUpsert),\n\t\tchannel.on('entity:removed', ({ uuids }) => applyEntityRemoved(uuids)),\n\t\tchannel.on('entity:thumbnail', applyThumbnails),\n\t\tchannel.on('entity:selection', applyEntitySelection),\n\t\tchannel.on('game:notice', applyGameNotice),\n\t\tchannel.on('catalog:snapshot', applyCatalog),\n\t\tchannel.on('scene:operation', applySceneOperation),\n\t];\n\n\t// Rebuild the uuid index from whatever survived a previous connection.\n\tentityIndex.clear();\n\tstageState.entities.forEach((entity, index) => {\n\t\tif (entity.uuid) entityIndex.set(entity.uuid, index);\n\t});\n\n\t// Hydrate from last-known state so a late-mounting editor is populated\n\t// without waiting for the game's next publish.\n\tconst config = channel.getState('game:config');\n\tif (config) applyGameConfig(config);\n\tconst snapshot = channel.getState('stage:snapshot');\n\tif (snapshot) applyStageSnapshot(snapshot);\n\tconst upserts = channel.getState('entity:upsert');\n\tif (upserts) applyEntityUpsert(upserts);\n\tconst thumbnails = channel.getState('entity:thumbnail');\n\tif (thumbnails) applyThumbnails(thumbnails);\n\tconst status = channel.getState('game:status');\n\tif (status) applyGameStatus(status);\n\tconst selection = channel.getState('entity:selection');\n\tif (selection) applyEntitySelection(selection);\n\tconst catalog = channel.getState('catalog:snapshot');\n\tif (catalog) applyCatalog(catalog);\n\n\treturn release;\n}\n\n/** Tear down all bridge subscriptions, ignoring the reference count. */\nexport function disconnectEditorBridge(): void {\n\tfor (const unsubscribe of unsubscribes) unsubscribe();\n\tunsubscribes = [];\n\tconnected = false;\n\tconnectionCount = 0;\n}\n\n// ── Editor → game commands ─────────────────────────────────────────────────\n\n/** Toggle the game's debug mode. */\nexport function sendDebugEnabled(enabled: boolean): void {\n\tchannel.send('debug:set', { enabled });\n}\n\n/** Switch the active editor tool in the game. */\nexport function sendTool(tool: BridgeDebugTool): void {\n\tchannel.send('tool:set', { tool });\n}\n\n/** Pause or resume the game loop. */\nexport function sendPlayback(paused: boolean): void {\n\tchannel.send('playback:set', { paused });\n}\n\n/** Select an entity in the game (null clears the selection). */\nexport function sendEntitySelect(uuid: string | null): void {\n\tchannel.send('entity:select', { uuid });\n}\n\n/** Focus/frame the game debug camera on an entity. */\nexport function sendEntityFocus(uuid: string): void {\n\tchannel.send('entity:focus', { uuid });\n}\n\n/** Write a stage variable in the running game. */\nexport function sendStageVariable(key: string, value: unknown): void {\n\tchannel.send('stage:variable:set', { key, value });\n}\n\n/**\n * Set an entity's transform absolutely.\n *\n * `quaternion` is authoritative when supplied; `rotation` is Euler radians for\n * the numeric fields, and round-trips less cleanly.\n */\nexport function sendEntityTransform(\n\tuuid: string,\n\ttransform: {\n\t\tposition?: BridgeVec3;\n\t\trotation?: BridgeVec3;\n\t\tquaternion?: BridgeQuat;\n\t\tscale?: BridgeVec3;\n\t},\n): void {\n\tchannel.send('entity:transform', { uuid, ...transform });\n}\n\n/** Arm the game's add tool with a catalog type, or `null` to disarm it. */\nexport function sendAddType(\n\ttypeId: string | null,\n\tprops?: Record<string, unknown>,\n): void {\n\tchannel.send('add:type:set', props ? { typeId, props } : { typeId });\n}\n\n/** Spawn a catalog entity without a placement click. */\nexport function sendEntityCreate(\n\ttypeId: string,\n\toptions?: { props?: Record<string, unknown>; pose?: BridgePose },\n): void {\n\tchannel.send('entity:create', {\n\t\ttypeId,\n\t\t...(options?.props ? { props: options.props } : {}),\n\t\t...(options?.pose ? { pose: options.pose } : {}),\n\t});\n}\n\n/** Push snap increments to the game's gizmo. */\nexport function sendSnapSettings(snap: SnapSettingsPayload): void {\n\tchannel.send('snap:set', snap);\n}\n\n/** Show or hide the game's construction-plane grid. */\nexport function sendGridVisible(visible: boolean): void {\n\tchannel.send('grid:set', { visible });\n}\n\n/** The shared bridge channel, for advanced subscriptions. */\nexport { channel as bridgeChannel };\n","/**\n * Entity thumbnail side-channel.\n *\n * Thumbnails are kept out of `stageState.entities` on purpose. They are large\n * (a PNG blob or data URL per entity) and arrive on their own message stream,\n * so carrying them in entity state would make every `reconcile` diff megabytes\n * of image payload and force a full array rewrite for each thumbnail that\n * lands. Components read this store directly by uuid instead.\n */\n\nimport { createStore, produce } from 'solid-js/store';\n\nexport interface EntityThumbnailEntry {\n\turl: string;\n\tbounds?: { width: number; height: number; depth: number };\n}\n\nconst [thumbnails, setThumbnails] = createStore<\n\tRecord<string, EntityThumbnailEntry>\n>({});\n\n/** Reactive thumbnail lookup for an entity, or undefined when none exists. */\nexport function getEntityThumbnail(\n\tuuid: string | undefined,\n): EntityThumbnailEntry | undefined {\n\treturn uuid ? thumbnails[uuid] : undefined;\n}\n\n/**\n * Store thumbnails, revoking any blob URL each one replaces so the browser can\n * release the underlying image.\n */\nexport function setEntityThumbnails(\n\tentries: { uuid: string; url: string; bounds?: EntityThumbnailEntry['bounds'] }[],\n): void {\n\tsetThumbnails(\n\t\tproduce((draft) => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst previous = draft[entry.uuid];\n\t\t\t\tif (previous && previous.url !== entry.url) {\n\t\t\t\t\trevokeIfBlobUrl(previous.url);\n\t\t\t\t}\n\t\t\t\tdraft[entry.uuid] = entry.bounds\n\t\t\t\t\t? { url: entry.url, bounds: entry.bounds }\n\t\t\t\t\t: { url: entry.url };\n\t\t\t}\n\t\t}),\n\t);\n}\n\n/** Drop thumbnails for entities that no longer exist. */\nexport function removeEntityThumbnails(uuids: string[]): void {\n\tsetThumbnails(\n\t\tproduce((draft) => {\n\t\t\tfor (const uuid of uuids) {\n\t\t\t\tconst previous = draft[uuid];\n\t\t\t\tif (!previous) continue;\n\t\t\t\trevokeIfBlobUrl(previous.url);\n\t\t\t\tdelete draft[uuid];\n\t\t\t}\n\t\t}),\n\t);\n}\n\n/** Drop every thumbnail, e.g. when a new stage is loaded. */\nexport function clearEntityThumbnails(): void {\n\tsetThumbnails(\n\t\tproduce((draft) => {\n\t\t\tfor (const uuid of Object.keys(draft)) {\n\t\t\t\trevokeIfBlobUrl(draft[uuid]!.url);\n\t\t\t\tdelete draft[uuid];\n\t\t\t}\n\t\t}),\n\t);\n}\n\nfunction revokeIfBlobUrl(url: string): void {\n\tif (url.startsWith('blob:') && typeof URL !== 'undefined') {\n\t\tURL.revokeObjectURL(url);\n\t}\n}\n","/**\n * The placeable entity types the game offers, and which one the Add tool is\n * armed with.\n *\n * The list is game-owned: it arrives over the bridge as `catalog:snapshot`, so\n * a host that registers its own entity types game-side gets them in the palette\n * with no editor change. Icons come through as inline SVG markup because the\n * editor and its hosts do not share an icon library.\n */\n\nimport { proxy } from 'valtio/vanilla';\nimport type { EntityTypeDescriptor } from '@zylem/bridge';\n\nimport { mirrorProxy } from '../common/proxy-mirror';\n\nexport interface CatalogState {\n\tentities: EntityTypeDescriptor[];\n\t/** Type the Add tool will place, or null when disarmed. */\n\tarmedTypeId: string | null;\n\t/**\n\t * Last type chosen from the palette, so re-arming the tool does not make the\n\t * user re-pick. Survives disarming; cleared only when the catalog no longer\n\t * contains it.\n\t */\n\tlastTypeId: string | null;\n}\n\nexport const catalogState = proxy<CatalogState>({\n\tentities: [],\n\tarmedTypeId: null,\n\tlastTypeId: null,\n});\n\n/** Solid-reactive view of {@link catalogState}, for components. */\nexport const catalogStore = mirrorProxy(catalogState);\n\nexport function setEntityCatalog(entities: EntityTypeDescriptor[]): void {\n\tcatalogState.entities = entities;\n\n\t// A type that vanished from the catalog cannot be placed any more.\n\tconst ids = new Set(entities.map((entity) => entity.id));\n\tif (catalogState.armedTypeId && !ids.has(catalogState.armedTypeId)) {\n\t\tcatalogState.armedTypeId = null;\n\t}\n\tif (catalogState.lastTypeId && !ids.has(catalogState.lastTypeId)) {\n\t\tcatalogState.lastTypeId = null;\n\t}\n}\n\nexport function getEntityDescriptor(id: string | null): EntityTypeDescriptor | null {\n\tif (!id) return null;\n\treturn catalogState.entities.find((entity) => entity.id === id) ?? null;\n}\n\nexport function setArmedType(typeId: string | null): void {\n\tcatalogState.armedTypeId = typeId;\n\tif (typeId) catalogState.lastTypeId = typeId;\n}\n\n/** The descriptor shown on the Add button: armed type, else the last chosen. */\nexport function buttonDescriptor(): EntityTypeDescriptor | null {\n\treturn (\n\t\tgetEntityDescriptor(catalogState.armedTypeId)\n\t\t?? getEntityDescriptor(catalogState.lastTypeId)\n\t);\n}\n\n// Searching and grouping the catalog now happen in @zylem/ui's ItemPicker\n// (`filterItems` / `groupItems`), which the Add palette is built on. An\n// `EntityTypeDescriptor` is already shaped like a `PickerItem`, so nothing\n// catalog-specific was needed to make the move.\n","/**\n * Solid-reactive mirrors of valtio proxies.\n *\n * The editor keeps its state in valtio so non-Solid hosts can read and write it,\n * but a valtio proxy read inside a Solid component tracks nothing — the\n * component renders once with the value it happened to see. Anything a component\n * reads therefore needs a Solid store fed by a valtio subscription, which is the\n * same shape as the hand-written sync in `editor-store.ts`, generalized.\n */\n\nimport { createStore, reconcile, type Store } from 'solid-js/store';\nimport { subscribe } from 'valtio/vanilla';\n\n/**\n * Plain deep copy of the proxy's current contents.\n *\n * Deliberately not `valtio`'s `snapshot()`: that returns a deeply frozen object,\n * and Solid's store writes into the objects it is given, so reconciling a frozen\n * snapshot throws on the next update. `structuredClone` is out too — it rejects\n * proxy objects outright.\n */\nfunction copy<T>(value: T): T {\n\tif (Array.isArray(value)) {\n\t\treturn value.map((entry) => copy(entry)) as unknown as T;\n\t}\n\tif (value instanceof Set) {\n\t\treturn new Set([...value].map((entry) => copy(entry))) as unknown as T;\n\t}\n\tif (value instanceof Map) {\n\t\treturn new Map(\n\t\t\t[...value].map(([entryKey, entryValue]) => [entryKey, copy(entryValue)]),\n\t\t) as unknown as T;\n\t}\n\t// Class instances are passed through by reference: the editor's state holds\n\t// only plain data, and a blind copy would strip the prototype off anything\n\t// else that turns up.\n\tif (value === null || typeof value !== 'object') return value;\n\tif (Object.getPrototypeOf(value) !== Object.prototype) return value;\n\n\tconst result: Record<string, unknown> = {};\n\tfor (const [entryKey, entryValue] of Object.entries(value)) {\n\t\tresult[entryKey] = copy(entryValue);\n\t}\n\treturn result as T;\n}\n\nexport interface ProxyMirrorOptions {\n\t/**\n\t * Property used to match array entries across updates, so reordering a list\n\t * moves rows instead of rewriting every one of them.\n\t */\n\tkey?: string;\n}\n\n/**\n * Mirror a valtio proxy into a Solid store.\n *\n * The subscription is never released, which is intended: proxies passed here are\n * module-level singletons that outlive every component, and dropping the\n * subscription when the last reader unmounts would leave a stale store behind\n * for the next one.\n */\nexport function mirrorProxy<T extends object>(\n\tsource: T,\n\toptions: ProxyMirrorOptions = {},\n): Store<T> {\n\tconst key = options.key ?? 'id';\n\tconst [store, setStore] = createStore<T>(copy(source));\n\tsubscribe(source, () => {\n\t\tsetStore(reconcile(copy(source), { key, merge: false }));\n\t});\n\treturn store;\n}\n","/**\n * Undo/redo history for scene edits.\n *\n * The editor owns the stack but never the inversion. Every edit originates in\n * the game (gizmo drags, placement clicks, delete clicks), so the game publishes\n * a committed before/after record and the editor stores it. Replaying one sends\n * it back over the bridge: undoing a delete has to produce the original entity\n * with its original uuid, which the editor could not do — all it ever receives\n * is a summary of name, type, and transform.\n *\n * In-memory only. A reload drops history, which is correct: the game's entities\n * are gone too, so the uuids every entry refers to would be dangling.\n */\n\nimport { proxy } from 'valtio/vanilla';\nimport type { SceneOperationPayload } from '@zylem/bridge';\n\nimport { bridgeChannel } from '../../bridge/editor-bridge';\nimport { mirrorProxy } from '../common/proxy-mirror';\n\n/**\n * Depth cap. Each entry holds two poses per affected entity, so this is cheap;\n * the limit exists so a long editing session cannot grow without bound. The\n * game's detached-entity bin is sized above this, so a uuid still reachable\n * from here is still restorable.\n */\nexport const MAX_HISTORY_DEPTH = 100;\n\nexport interface HistoryState {\n\t/** Oldest first; the last entry is what `undo()` reverts. */\n\tundoStack: SceneOperationPayload[];\n\t/** Operations that have been undone, newest last. */\n\tredoStack: SceneOperationPayload[];\n}\n\nexport const historyState = proxy<HistoryState>({\n\tundoStack: [],\n\tredoStack: [],\n});\n\n/** Solid-reactive view of {@link historyState}, for components. */\nexport const historyStore = mirrorProxy(historyState, { key: 'opId' });\n\nexport function canUndo(): boolean {\n\treturn historyState.undoStack.length > 0;\n}\n\nexport function canRedo(): boolean {\n\treturn historyState.redoStack.length > 0;\n}\n\n/** Label of the operation `undo()` would revert, for menu text. */\nexport function undoLabel(): string | null {\n\treturn historyState.undoStack[historyState.undoStack.length - 1]?.label ?? null;\n}\n\n/** Label of the operation `redo()` would replay. */\nexport function redoLabel(): string | null {\n\treturn historyState.redoStack[historyState.redoStack.length - 1]?.label ?? null;\n}\n\n/**\n * Record a committed operation.\n *\n * Pushing invalidates the redo stack: once a new edit lands, the undone\n * operations describe a scene state that no longer exists on the other side of\n * the branch.\n */\nexport function pushOperation(op: SceneOperationPayload): void {\n\thistoryState.undoStack.push(op);\n\tif (historyState.undoStack.length > MAX_HISTORY_DEPTH) {\n\t\thistoryState.undoStack.shift();\n\t}\n\tif (historyState.redoStack.length) {\n\t\thistoryState.redoStack = [];\n\t}\n}\n\n/** Revert the most recent operation. */\nexport function undo(): boolean {\n\tconst op = historyState.undoStack.pop();\n\tif (!op) return false;\n\thistoryState.redoStack.push(op);\n\tbridgeChannel.send('scene:operation:apply', { op, direction: 'undo' });\n\treturn true;\n}\n\n/** Replay the most recently undone operation. */\nexport function redo(): boolean {\n\tconst op = historyState.redoStack.pop();\n\tif (!op) return false;\n\thistoryState.undoStack.push(op);\n\tbridgeChannel.send('scene:operation:apply', { op, direction: 'redo' });\n\treturn true;\n}\n\n/**\n * Drop all history. Called on a fresh stage snapshot, because the entities the\n * stack refers to are gone and replaying an entry would either do nothing or\n * hit an unrelated entity that happens to share a uuid.\n */\nexport function clearHistory(): void {\n\thistoryState.undoStack = [];\n\thistoryState.redoStack = [];\n}\n","/**\n * Host observation of committed scene edits.\n *\n * Every edit the editor records is also announced here, so an embedding app can\n * react to it — persisting a layout, marking a document dirty, or eventually\n * writing changes back to source. Kept in its own module so `editor-bridge` does\n * not have to import the host surface (which imports the bridge), which would be\n * circular.\n */\n\nimport type { SceneOperationPayload } from '@zylem/bridge';\n\nexport type SceneOperationListener = (op: SceneOperationPayload) => void;\n\nconst listeners = new Set<SceneOperationListener>();\n\n/**\n * Observe committed scene operations.\n *\n * @returns An unsubscribe function.\n */\nexport function onSceneOperation(listener: SceneOperationListener): () => void {\n\tlisteners.add(listener);\n\treturn () => {\n\t\tlisteners.delete(listener);\n\t};\n}\n\n/** @internal Announce an operation to host listeners. */\nexport function notifySceneOperation(op: SceneOperationPayload): void {\n\tfor (const listener of listeners) {\n\t\ttry {\n\t\t\tlistener(op);\n\t\t} catch (error) {\n\t\t\tconsole.error('[zylem/editor] scene operation listener failed', error);\n\t\t}\n\t}\n}\n","import { ItemPicker, MenuButton } from '@zylem/ui/components';\nimport Plus from 'lucide-solid/icons/plus';\nimport { createMemo, Show, type Component } from 'solid-js';\nimport { unwrap } from 'solid-js/store';\nimport type { EntityTypeDescriptor } from '@zylem/bridge';\n\nimport { setDebugTool, debugStore } from '..';\nimport { sendAddType, sendTool } from '../../bridge/editor-bridge';\nimport {\n isAddArmed,\n resolvePlacementTarget,\n toPickerItems,\n} from './add-button-state';\nimport { catalogStore, setArmedType } from './catalog-state';\n\n/**\n * The Add tool: a palette of entity types plus an armed placement mode.\n *\n * Split interaction, because choosing what to place and placing it are separate\n * jobs. The chevron half opens the palette; the button face toggles the armed\n * state for whatever is already chosen, so placing ten boxes is one pick and ten\n * clicks rather than ten trips through the menu.\n *\n * The palette's entries are game-owned — they arrive as `catalog:snapshot` — so a\n * host that registers its own entity types gets them here for free.\n */\nexport const AddButton: Component = () => {\n const isArmed = () => isAddArmed(debugStore.tool, catalogStore.armedTypeId);\n\n const find = (id: string | null): EntityTypeDescriptor | null => {\n if (!id) return null;\n return catalogStore.entities.find((entity) => entity.id === id) ?? null;\n };\n\n /** What the face shows and what a press places. */\n const target = createMemo(() =>\n resolvePlacementTarget(\n catalogStore.entities,\n catalogStore.armedTypeId,\n catalogStore.lastTypeId,\n ),\n );\n\n const items = createMemo(() => toPickerItems(catalogStore.entities));\n\n const arm = (descriptor: EntityTypeDescriptor) => {\n setArmedType(descriptor.id);\n // Unwrapped: the props cross the bridge into the game, which should not\n // receive a live handle on the editor's store.\n sendAddType(descriptor.id, unwrap(descriptor.defaultProps));\n setDebugTool('add');\n sendTool('add');\n };\n\n /** Arm placement, or re-arm it — pressing an armed Add leaves it armed. */\n const armTarget = () => {\n const descriptor = target();\n if (descriptor) arm(descriptor);\n };\n\n return (\n <div class=\"zylem-add-tool\">\n <MenuButton\n label={target() ? `Place ${target()!.label}` : 'Add'}\n selected={isArmed()}\n // An empty catalog is the one case with nothing to arm. Disabled\n // rather than silently inert, so a press that cannot work looks\n // like one; the game publishes its catalog on connect, so this is\n // only ever the no-game state.\n disabled={catalogStore.entities.length === 0}\n onAction={armTarget}\n menu={(close) => (\n <ItemPicker\n items={items()}\n selectedId={catalogStore.armedTypeId}\n searchPlaceholder=\"Search entities…\"\n emptyMessage=\"No entity types published. Is a game running?\"\n onSelect={(item) => {\n const descriptor = find(item.id);\n if (descriptor) arm(descriptor);\n close();\n }}\n />\n )}\n >\n {/* Follows `target`, not `current`, so the glyph, the label and what\n\t\t\t\t a press actually places all agree before the first pick. */}\n <Show when={target()?.icon} fallback={<Plus class=\"zylem-icon\" />}>\n {(icon) => <span class=\"zylem-add-tool__glyph\" innerHTML={icon()} />}\n </Show>\n </MenuButton>\n </div>\n );\n};\n","/**\n * The Add tool's decisions, kept out of the component so they can be tested\n * without a DOM. The component is left as the part that renders and fires the\n * bridge calls.\n */\n\nimport type { PickerItem } from '@zylem/ui/components';\nimport type { EntityTypeDescriptor } from '@zylem/bridge';\n\nimport type { DebugTools } from '../entities/entities-state';\n\n/**\n * Whether the Add tool will place something on the next click in the viewport.\n *\n * Both halves matter: the tool can be selected with nothing chosen yet, and a\n * type stays chosen after the tool is switched away so re-arming does not mean\n * re-picking.\n */\nexport function isAddArmed(tool: DebugTools, armedTypeId: string | null): boolean {\n\treturn tool === 'add' && armedTypeId !== null;\n}\n\n/**\n * What pressing the Add button places.\n *\n * Three fallbacks deep, because each one is a state the button can be in and\n * none of them may leave the press with nothing to do: the armed type while\n * placing, the last type chosen once disarmed (so re-arming is not re-picking),\n * and the catalog's first entry on a fresh editor that has never picked at all.\n * Only an empty catalog returns null, and the button is disabled for that.\n *\n * Pure over its arguments rather than reading the store, so the component can\n * pass its reactive view in and keep its dependency tracking.\n */\nexport function resolvePlacementTarget(\n\tentities: EntityTypeDescriptor[],\n\tarmedTypeId: string | null,\n\tlastTypeId: string | null,\n): EntityTypeDescriptor | null {\n\tconst byId = (id: string | null) =>\n\t\tid ? entities.find((entity) => entity.id === id) ?? null : null;\n\n\treturn byId(armedTypeId) ?? byId(lastTypeId) ?? entities[0] ?? null;\n}\n\n/**\n * Catalog descriptors as picker items.\n *\n * `tags` and `group` are carried across rather than dropped, because they are\n * what makes the palette's search and headings work — a type findable by synonym\n * game-side should stay findable here.\n */\nexport function toPickerItems(entities: EntityTypeDescriptor[]): PickerItem[] {\n\treturn entities.map((entity) => ({\n\t\tid: entity.id,\n\t\tlabel: entity.label,\n\t\tgroup: entity.group,\n\t\t// Inline SVG markup from the game's registry rather than an icon-set name,\n\t\t// because the editor and its hosts do not share an icon library. The source\n\t\t// is the running game in the same realm, so this is not a new trust\n\t\t// boundary.\n\t\ticon: entity.icon,\n\t\tdescription: entity.description,\n\t\ttags: entity.tags,\n\t}));\n}\n","import MousePointer from 'lucide-solid/icons/mouse-pointer';\nimport type { Component } from 'solid-js';\nimport { setDebugTool, debugStore } from '..';\nimport { sendTool } from '../../bridge/editor-bridge';\nimport { ToolbarButton } from '@zylem/ui/components';\n\nexport const SelectButton: Component = () => {\n const handleClick = () => {\n const newTool = debugStore.tool === 'select' ? 'none' : 'select';\n setDebugTool(newTool);\n sendTool(newTool);\n };\n\n return (\n <ToolbarButton\n label=\"Select\"\n selected={debugStore.tool === 'select'}\n onClick={handleClick}\n >\n <MousePointer class=\"zylem-icon\" />\n </ToolbarButton>\n );\n};\n","import Pause from 'lucide-solid/icons/pause';\nimport Play from 'lucide-solid/icons/play';\nimport type { Component } from 'solid-js';\nimport { setPaused, debugState, debugStore } from '..';\nimport { sendPlayback } from '../../bridge/editor-bridge';\nimport { ToolbarButton } from '@zylem/ui/components';\n\nexport const PlayPauseButton: Component = () => {\n const handleClick = () => {\n const newPaused = !debugState.paused;\n setPaused(newPaused);\n sendPlayback(newPaused);\n };\n\n return (\n <ToolbarButton\n label={debugStore.paused ? 'Play' : 'Pause'}\n selected={debugStore.paused}\n onClick={handleClick}\n >\n {debugStore.paused ? (\n <Play class=\"zylem-icon\" />\n ) : (\n <Pause class=\"zylem-icon\" />\n )}\n </ToolbarButton>\n );\n};\n","import Bug from 'lucide-solid/icons/bug';\nimport type { Component } from 'solid-js';\nimport { debugStore, setDebugStore } from '../editor-store';\nimport { sendDebugEnabled } from '../../bridge/editor-bridge';\nimport { ToolbarButton } from '@zylem/ui/components';\n\nexport const DebugButton: Component = () => {\n const handleClick = () => {\n const newDebug = !debugStore.debug;\n setDebugStore('debug', newDebug);\n sendDebugEnabled(newDebug);\n };\n\n return (\n <ToolbarButton\n label=\"Debug\"\n selected={debugStore.debug}\n onClick={handleClick}\n >\n <Bug class=\"zylem-icon\" />\n </ToolbarButton>\n );\n};\n","import Grid3x3 from 'lucide-solid/icons/grid-3x3';\nimport Magnet from 'lucide-solid/icons/magnet';\nimport type { Component } from 'solid-js';\n\nimport {\n\tsetGridVisible,\n\tsetSnapEnabled,\n\ttransformStore,\n} from '../transform/transform-state';\nimport { ToolbarButton } from '@zylem/ui/components';\n\n/** Show or hide the game's construction-plane grid. */\nexport const GridButton: Component = () => (\n\t<ToolbarButton\n\t\tlabel={transformStore.gridVisible ? 'Hide grid' : 'Show grid'}\n\t\tselected={transformStore.gridVisible}\n\t\tonClick={() => setGridVisible(!transformStore.gridVisible)}\n\t>\n\t\t<Grid3x3 class=\"zylem-icon\" />\n\t</ToolbarButton>\n);\n\n/**\n * Snap toggle. Alt does the same thing per-drag; this is for turning it off for\n * a whole stretch of work rather than a single move.\n */\nexport const SnapButton: Component = () => (\n\t<ToolbarButton\n\t\tlabel={transformStore.enabled ? 'Snapping on' : 'Snapping off'}\n\t\tselected={transformStore.enabled}\n\t\tonClick={() => setSnapEnabled(!transformStore.enabled)}\n\t>\n\t\t<Magnet class=\"zylem-icon\" />\n\t</ToolbarButton>\n);\n","/**\n * Snap settings and grid visibility for the transform tools.\n *\n * Owned by the editor because it is the UI for them, and mirrored to the game\n * over `snap:set` — the gizmo does the actual snapping, since only it knows the\n * drag target.\n */\n\nimport { proxy, subscribe } from 'valtio/vanilla';\nimport type { SnapSettingsPayload } from '@zylem/bridge';\n\nimport { sendGridVisible, sendSnapSettings } from '../../bridge/editor-bridge';\nimport { mirrorProxy } from '../common/proxy-mirror';\n\n/** 15 degrees, the default rotation increment. */\nexport const DEFAULT_ROTATE_SNAP = Math.PI / 12;\n\nexport interface TransformState extends SnapSettingsPayload {\n\t/** Whether the game draws its construction-plane grid. */\n\tgridVisible: boolean;\n}\n\nexport const transformState = proxy<TransformState>({\n\tenabled: true,\n\ttranslate: 0.25,\n\trotate: DEFAULT_ROTATE_SNAP,\n\tscale: 0.1,\n\tgridVisible: false,\n});\n\n/** Solid-reactive view of {@link transformState}, for components. */\nexport const transformStore = mirrorProxy(transformState);\n\nfunction snapPayload(): SnapSettingsPayload {\n\treturn {\n\t\tenabled: transformState.enabled,\n\t\ttranslate: transformState.translate,\n\t\trotate: transformState.rotate,\n\t\tscale: transformState.scale,\n\t};\n}\n\nexport function setSnapEnabled(enabled: boolean): void {\n\ttransformState.enabled = enabled;\n}\n\nexport function setSnapIncrements(\n\tincrements: Partial<Pick<TransformState, 'translate' | 'rotate' | 'scale'>>,\n): void {\n\t// A zero or negative increment would snap every value onto 0.\n\tfor (const [key, value] of Object.entries(increments)) {\n\t\tif (typeof value === 'number' && value > 0) {\n\t\t\t(transformState as any)[key] = value;\n\t\t}\n\t}\n}\n\nexport function setGridVisible(visible: boolean): void {\n\ttransformState.gridVisible = visible;\n}\n\nlet installed = false;\n\n/**\n * Mirror snap and grid changes to the game, and push the current values once so\n * a game that started with different defaults is brought into line.\n *\n * @returns An unsubscribe function.\n */\nexport function connectTransformState(): () => void {\n\tif (installed) return () => {};\n\tinstalled = true;\n\n\tsendSnapSettings(snapPayload());\n\tsendGridVisible(transformState.gridVisible);\n\n\tlet lastGridVisible = transformState.gridVisible;\n\tconst unsubscribe = subscribe(transformState, () => {\n\t\tsendSnapSettings(snapPayload());\n\t\tif (transformState.gridVisible !== lastGridVisible) {\n\t\t\tlastGridVisible = transformState.gridVisible;\n\t\t\tsendGridVisible(lastGridVisible);\n\t\t}\n\t});\n\n\treturn () => {\n\t\tinstalled = false;\n\t\tunsubscribe();\n\t};\n}\n","import Redo2 from 'lucide-solid/icons/redo-2';\nimport Undo2 from 'lucide-solid/icons/undo-2';\nimport type { Component } from 'solid-js';\n\nimport { historyStore, redo, undo } from '../history/history-store';\nimport { ToolbarButton } from '@zylem/ui/components';\n\nconst lastLabel = (stack: { label: string }[]): string | null =>\n\tstack[stack.length - 1]?.label ?? null;\n\nexport const UndoButton: Component = () => {\n\tconst label = () => {\n\t\tconst next = lastLabel(historyStore.undoStack);\n\t\treturn next ? `Undo ${next}` : 'Nothing to undo';\n\t};\n\n\treturn (\n\t\t<ToolbarButton label={label()} onClick={() => undo()}>\n\t\t\t<Undo2 class=\"zylem-icon\" />\n\t\t</ToolbarButton>\n\t);\n};\n\nexport const RedoButton: Component = () => {\n\tconst label = () => {\n\t\tconst next = lastLabel(historyStore.redoStack);\n\t\treturn next ? `Redo ${next}` : 'Nothing to redo';\n\t};\n\n\treturn (\n\t\t<ToolbarButton label={label()} onClick={() => redo()}>\n\t\t\t<Redo2 class=\"zylem-icon\" />\n\t\t</ToolbarButton>\n\t);\n};\n","import Move3d from 'lucide-solid/icons/move-3d';\nimport Rotate3d from 'lucide-solid/icons/rotate-3d';\nimport Scale3d from 'lucide-solid/icons/scale-3d';\nimport { createMemo, type Component, type JSX } from 'solid-js';\nimport { setDebugTool, debugStore, setSelectedEntityId, type DebugTools } from '..';\nimport { sendAddType, sendEntitySelect, sendTool } from '../../bridge/editor-bridge';\nimport { useEditor } from '../EditorContext';\nimport { setArmedType } from './catalog-state';\nimport { resolveTransformTarget } from './transform-button-state';\nimport { ToolbarButton } from '@zylem/ui/components';\n\ninterface TransformToolButtonProps {\n\ttool: Extract<DebugTools, 'translate' | 'rotate' | 'scale'>;\n\tlabel: string;\n\tchildren: JSX.Element;\n}\n\n/**\n * A gizmo-mode toggle. Selecting one disarms the Add tool, since a click would\n * otherwise be ambiguous between placing and grabbing a handle.\n *\n * Always mounted, rather than appearing with the selection: a toolbar whose\n * buttons come and go is one you have to look at before you can aim at it, and\n * pressing one with nothing selected has an obvious meaning — act on whatever was\n * last worked on. Disabled only when even that is unavailable.\n */\nconst TransformToolButton: Component<TransformToolButtonProps> = (props) => {\n\tconst { stage } = useEditor();\n\n\tconst target = createMemo(() =>\n\t\tresolveTransformTarget(\n\t\t\tdebugStore.selected,\n\t\t\tdebugStore.lastTouched,\n\t\t\tstage.entities\n\t\t\t\t.map((entity) => entity.uuid)\n\t\t\t\t.filter((uuid): uuid is string => Boolean(uuid)),\n\t\t),\n\t);\n\n\tconst handleClick = () => {\n\t\tconst uuid = target();\n\t\tif (!uuid) return;\n\n\t\tconst nextTool = debugStore.tool === props.tool ? 'none' : props.tool;\n\t\tsetArmedType(null);\n\t\tsendAddType(null);\n\n\t\t/*\n\t\t * Selection first, and both writes in one synchronous run. The transform\n\t\t * guard drops a gizmo tool whose selection is empty, and it only ever sees\n\t\t * the state a batch of `debugState` writes leaves behind — so what keeps\n\t\t * this safe is that nothing awaits in between, rather than the order alone.\n\t\t * Sent to the game as well as set here, because the gizmo's pivot is\n\t\t * computed game-side from its own copy of the selection.\n\t\t */\n\t\tif (nextTool !== 'none' && debugStore.selected.length === 0) {\n\t\t\tsetSelectedEntityId(uuid);\n\t\t\tsendEntitySelect(uuid);\n\t\t}\n\n\t\tsetDebugTool(nextTool);\n\t\tsendTool(nextTool);\n\t};\n\n\treturn (\n\t\t<ToolbarButton\n\t\t\tlabel={props.label}\n\t\t\tselected={debugStore.tool === props.tool}\n\t\t\tdisabled={!target()}\n\t\t\tonClick={handleClick}\n\t\t>\n\t\t\t{props.children}\n\t\t</ToolbarButton>\n\t);\n};\n\nexport const TranslateButton: Component = () => (\n\t<TransformToolButton tool=\"translate\" label=\"Move\">\n\t\t<Move3d class=\"zylem-icon\" />\n\t</TransformToolButton>\n);\n\nexport const RotateButton: Component = () => (\n\t<TransformToolButton tool=\"rotate\" label=\"Rotate\">\n\t\t<Rotate3d class=\"zylem-icon\" />\n\t</TransformToolButton>\n);\n\nexport const ScaleButton: Component = () => (\n\t<TransformToolButton tool=\"scale\" label=\"Scale\">\n\t\t<Scale3d class=\"zylem-icon\" />\n\t</TransformToolButton>\n);\n","/**\n * The gizmo tools' decisions, kept out of the components so they can be tested\n * without a DOM — the same split as `add-button-state.ts`.\n */\n\n/**\n * The entity a gizmo tool should act on.\n *\n * The current selection when there is one. Otherwise the last entity worked on,\n * which is what lets you place a box and press Rotate without clicking the box\n * first. That fallback is checked against the entities that actually exist,\n * because the remembered uuid outlives the entity: deleting it, or undoing the\n * create that made it, leaves the memory pointing at nothing.\n *\n * `null` means there is nothing to act on at all, and the buttons are disabled —\n * entering a gizmo mode pauses the simulation, so arming one with no target would\n * freeze the game and show no gizmo to explain why.\n */\nexport function resolveTransformTarget(\n\tselectedIds: readonly string[],\n\tlastTouchedId: string | null,\n\texistingUuids: readonly string[],\n): string | null {\n\tconst selected = selectedIds[0];\n\tif (selected) return selected;\n\n\tif (!lastTouchedId) return null;\n\treturn existingUuids.includes(lastTouchedId) ? lastTouchedId : null;\n}\n","import { type Component } from 'solid-js';\nimport { DeleteButton } from './DeleteButton';\nimport { AddButton } from './AddButton';\nimport { SelectButton } from './SelectButton';\nimport { PlayPauseButton } from './PlayPauseButton';\nimport { DebugButton } from './DebugButton';\nimport { GridButton, SnapButton } from './GridButton';\nimport { RedoButton, UndoButton } from './HistoryButtons';\nimport { RotateButton, ScaleButton, TranslateButton } from './TransformButtons';\n\nexport const Toolbar: Component = () => {\n return (\n <div class=\"zylem-toolbar\">\n <div class=\"zylem-toolbar-group\">\n <DebugButton />\n <SelectButton />\n {/*\n * Always mounted, disabling themselves when there is nothing to\n * act on. They used to appear with the selection, which moved\n * every button to their right each time it changed.\n */}\n <span class=\"zylem-toolbar-transforms\">\n <TranslateButton />\n <RotateButton />\n <ScaleButton />\n </span>\n </div>\n <span class=\"zylem-toolbar-divider\" />\n <div class=\"zylem-toolbar-group\">\n <AddButton />\n <DeleteButton />\n </div>\n <span class=\"zylem-toolbar-divider\" />\n <div class=\"zylem-toolbar-group\">\n <SnapButton />\n <GridButton />\n <UndoButton />\n <RedoButton />\n <PlayPauseButton />\n </div>\n </div>\n );\n};\n","import { Accordion } from '@kobalte/core';\nimport { Index, Show, type Component } from 'solid-js';\nimport { debugStore, setOpenSections } from '../editor-store';\nimport { PANEL_CONFIGS, renderPanelContent } from './panel-config';\nimport { DraggableAccordionItem } from './DraggableAccordionItem';\n\n/**\n * Accordion menu for debug UI with multiple panels.\n * Panels can be dragged out to become independent floating windows.\n * Console is open by default, and open sections expand to fill available space.\n */\nexport const AccordionMenu: Component = () => {\n // Get panels that are not currently detached, in order\n const getDockedPanels = () => {\n const detachedIds = Object.keys(debugStore.detachedPanels);\n return debugStore.panelOrder\n .filter((id) => !detachedIds.includes(id))\n .map((id) => PANEL_CONFIGS.find((p) => p.id === id))\n .filter((p): p is NonNullable<typeof p> => p !== undefined);\n };\n\n // Check if we're in a drag-to-reattach operation\n const isDraggingToReattach = () => debugStore.draggingPanelId !== null;\n const dropTargetIndex = () => debugStore.dropTargetIndex;\n\n return (\n <Accordion.Root\n multiple\n class=\"zylem-accordion\"\n value={debugStore.openSections}\n onChange={setOpenSections}\n >\n {/* Drop indicator at the top */}\n <Show when={isDraggingToReattach() && dropTargetIndex() === 0}>\n <div class=\"accordion-drop-indicator\" />\n </Show>\n\n <Index each={getDockedPanels()}>\n {(panel, index) => (\n <>\n <DraggableAccordionItem value={panel().id} title={panel().title}>\n {renderPanelContent(panel().id)}\n </DraggableAccordionItem>\n {/* Drop indicator after each item */}\n <Show when={isDraggingToReattach() && dropTargetIndex() === index + 1}>\n <div class=\"accordion-drop-indicator\" />\n </Show>\n </>\n )}\n </Index>\n </Accordion.Root>\n );\n};\n","import { Button } from '@zylem/ui/components';\nimport type { Component } from 'solid-js';\nimport { Show } from 'solid-js';\nimport { useEditor } from '../EditorContext';\nimport { printToConsole } from '..';\n\nexport const GameSection: Component = () => {\n const { game } = useEditor();\n\n return (\n <div class=\"panel-content\">\n <Show when={game.config}>\n <section class=\"zylem-property-list\">\n <div class=\"zylem-property-row\">\n <span class=\"zylem-property-label\">ID</span>\n <span class=\"zylem-property-value\">{game.config?.id}</span>\n </div>\n <div class=\"zylem-property-row\">\n <span class=\"zylem-property-label\">Aspect Ratio</span>\n <span class=\"zylem-property-value\">{game.config?.aspectRatio.toFixed(3)}</span>\n </div>\n <div class=\"zylem-property-row\">\n <span class=\"zylem-property-label\">Fullscreen</span>\n <span class=\"zylem-property-value\">{game.config?.fullscreen ? 'Yes' : 'No'}</span>\n </div>\n <div class=\"zylem-property-row\">\n <span class=\"zylem-property-label\">Debug</span>\n <span class=\"zylem-property-value\">{game.config?.debug ? 'Yes' : 'No'}</span>\n </div>\n <Show when={game.config?.internalResolution}>\n <div class=\"zylem-property-row\">\n <span class=\"zylem-property-label\">Resolution</span>\n <span class=\"zylem-property-value\">\n {game.config?.internalResolution?.width}x{game.config?.internalResolution?.height}\n </span>\n </div>\n </Show>\n <Show when={game.config?.bodyBackground}>\n <div class=\"zylem-property-row\">\n <span class=\"zylem-property-label\">Background</span>\n <span class=\"zylem-property-value\">{game.config?.bodyBackground}</span>\n </div>\n </Show>\n </section>\n </Show>\n <section class=\"zylem-toolbar\">\n <Button\n size=\"sm\"\n onClick={() => {\n printToConsole(\n `Global State: ${JSON.stringify(game.globals, null, 2)}`,\n );\n }}\n >\n Print Global State\n </Button>\n <Button\n size=\"sm\"\n onClick={() => {\n printToConsole(`All State: ${JSON.stringify(game, null, 2)}`);\n }}\n >\n Print All\n </Button>\n </section>\n </div>\n );\n};\n","import { Button } from '@zylem/ui/components';\nimport type { Component } from 'solid-js';\nimport { Show } from 'solid-js';\nimport { useEditor } from '../EditorContext';\nimport { stageStateToString, stageState } from './stage-state';\nimport { copyStageExport, stageExportToString } from './stage-export';\nimport { printToConsole } from '..';\nimport { PropertyRow } from '../common/PropertyRow';\n\nexport const StageSection: Component = () => {\n const { stage } = useEditor();\n\n return (\n <div class=\"panel-content\">\n <Show when={stage.config}>\n <section class=\"zylem-property-list\">\n <PropertyRow label=\"ID\" value={stage.config?.id} />\n <PropertyRow label=\"Background\" value={stage.config?.backgroundColor} />\n <Show when={stage.config?.backgroundImage}>\n <PropertyRow \n label=\"Image\" \n value={stage.config?.backgroundImage ?? ''} \n isPath={true}\n />\n </Show>\n <PropertyRow label=\"Gravity\">\n X:{stage.config?.gravity.x.toFixed(2)} Y:{stage.config?.gravity.y.toFixed(2)} Z:{stage.config?.gravity.z.toFixed(2)}\n </PropertyRow>\n <Show when={Object.keys(stage.config?.variables ?? {}).length > 0}>\n <PropertyRow \n label=\"Variables\" \n value={`${Object.keys(stage.config?.variables ?? {}).length} defined`} \n />\n </Show>\n </section>\n </Show>\n <section class=\"zylem-toolbar\">\n <Button\n size=\"sm\"\n onClick={() => {\n printToConsole(`Stage State: ${stageStateToString(stageState)}`);\n }}\n >\n Print Stage State\n </Button>\n <Button\n size=\"sm\"\n onClick={() => {\n void copyStageExport().then((json) => {\n if (json) {\n printToConsole(\n `Copied stage export (${stage.entities.length} entities) to clipboard.`,\n );\n return;\n }\n // Without the clipboard the work is still recoverable\n // from the console, which is the point of exporting.\n printToConsole(\n `Clipboard unavailable; stage export follows.\\n${stageExportToString()}`,\n );\n });\n }}\n >\n Export Stage\n </Button>\n </section>\n </div>\n );\n};\n","/**\n * Stage export.\n *\n * Edits are runtime-only: moving a crate in the editor does not rewrite the\n * source that created it. Export is the bridge between the two — it dumps the\n * current stage as JSON so the values can be pasted back into the code that\n * authored the scene. Source write-back is a later problem; this makes the work\n * recoverable in the meantime.\n *\n * Built from the editor's own bridge state rather than `@zylem/game-lib/schema`,\n * because the editor has no game-lib dependency at runtime and the entity\n * blueprint schema stores 2D positions, which would drop the Z of every\n * transform this feature exists to preserve.\n */\n\nimport type { Vector3Like } from '../../types';\nimport { stageState } from './stage-state';\n\nexport interface StageExportEntity {\n\tuuid: string;\n\tname?: string;\n\ttype?: string;\n\tposition?: Vector3Like;\n\t/** Euler angles in radians, matching the game's own representation. */\n\trotation?: Vector3Like;\n\tscale?: Vector3Like;\n}\n\nexport interface StageExport {\n\t/** Bumped when the shape changes, so an old file is recognisable. */\n\tversion: 1;\n\texportedAt: string;\n\tstage: {\n\t\tid: string;\n\t\tbackgroundColor: string;\n\t\tbackgroundImage: string | null;\n\t\tgravity: Vector3Like;\n\t\tvariables: Record<string, unknown>;\n\t} | null;\n\tentities: StageExportEntity[];\n}\n\n/** Snapshot the current stage as a plain, serializable object. */\nexport function buildStageExport(): StageExport {\n\tconst config = stageState.config;\n\tconst entities: StageExportEntity[] = [];\n\n\tfor (const entity of stageState.entities) {\n\t\tif (!entity.uuid) continue;\n\t\tconst record: StageExportEntity = { uuid: entity.uuid };\n\t\tif (entity.name !== undefined) record.name = entity.name;\n\t\tif (entity.type !== undefined) record.type = entity.type;\n\t\tif (entity.position) record.position = { ...entity.position };\n\t\tif (entity.rotation) record.rotation = { ...entity.rotation };\n\t\tif (entity.scale) record.scale = { ...entity.scale };\n\t\tentities.push(record);\n\t}\n\n\treturn {\n\t\tversion: 1,\n\t\texportedAt: new Date().toISOString(),\n\t\tstage: config\n\t\t\t? {\n\t\t\t\t\tid: config.id,\n\t\t\t\t\tbackgroundColor: config.backgroundColor,\n\t\t\t\t\tbackgroundImage: config.backgroundImage,\n\t\t\t\t\tgravity: { ...config.gravity },\n\t\t\t\t\tvariables: { ...config.variables },\n\t\t\t\t}\n\t\t\t: null,\n\t\tentities,\n\t};\n}\n\n/** The export as formatted JSON. */\nexport function stageExportToString(): string {\n\treturn JSON.stringify(buildStageExport(), null, 2);\n}\n\n/**\n * Copy the export to the clipboard.\n *\n * @returns The serialized stage when the copy succeeded, or `null` when the\n * clipboard was unavailable — over plain HTTP, or without a user gesture, the\n * API is either missing or rejects, and the caller falls back to the console.\n */\nexport async function copyStageExport(): Promise<string | null> {\n\tconst json = stageExportToString();\n\tif (!navigator.clipboard?.writeText) return null;\n\ttry {\n\t\tawait navigator.clipboard.writeText(json);\n\t\treturn json;\n\t} catch {\n\t\treturn null;\n\t}\n}\n","import { PropertyRow as UIPropertyRow } from '@zylem/ui/components';\nimport type { Component, JSX } from 'solid-js';\nimport { printToConsole } from '..';\n\nexport interface PropertyRowProps {\n\tlabel: string;\n\t/** The value to display. Can be a string, number, or JSX element. */\n\tvalue?: string | number | JSX.Element;\n\t/** If true, treat string values as paths and truncate long ones. */\n\tisPath?: boolean;\n\t/** Maximum path segments to show (default: 3 = filename + 2 parent dirs). */\n\tmaxPathSegments?: number;\n\t/** Custom class for the value span. */\n\tvalueClass?: string;\n\t/** Children can be used instead of value for complex content. */\n\tchildren?: JSX.Element;\n}\n\n/**\n * Editor PropertyRow — thin wrapper over the @zylem/ui HyperGlass\n * PropertyRow; clicking a truncated path logs the full path to the console.\n */\nexport const PropertyRow: Component<PropertyRowProps> = (props) => {\n\treturn (\n\t\t<UIPropertyRow\n\t\t\tlabel={props.label}\n\t\t\tvalue={props.value}\n\t\t\tisPath={props.isPath}\n\t\t\tmaxPathSegments={props.maxPathSegments}\n\t\t\tvalueClass={props.valueClass}\n\t\t\tonPathClick={(fullValue) => printToConsole(`Full path: ${fullValue}`)}\n\t\t>\n\t\t\t{props.children}\n\t\t</UIPropertyRow>\n\t);\n};\n","import type { Component } from 'solid-js';\nimport { For } from 'solid-js';\nimport { useEditor } from '../EditorContext';\nimport { EntityThumbnail } from './EntityThumbnail';\nimport { sendEntityFocus, sendEntitySelect } from '../../bridge/editor-bridge';\nimport { setDebugStore } from '../editor-store';\nimport { setSelectedEntityId } from './entities-state';\nimport { getEntityThumbnail } from './thumbnail-store';\nimport { printToConsole } from '..';\nimport type { BaseEntityInterface } from '../../types';\n\n/**\n * Handle entity button click — log entity info to the editor console, select\n * the entity, and ask the game (via the bridge) to frame the debug camera on\n * it (no-op in stub mode).\n */\nfunction handleEntityClick(entity: Partial<BaseEntityInterface>): void {\n\tif (!entity.uuid) return;\n\n\tprintToConsole(`Entity: ${JSON.stringify(entity, null, 2)}`);\n\tsetSelectedEntityId(entity.uuid);\n\tsendEntitySelect(entity.uuid);\n\t// Focusing enables debug mode game-side; mirror that in the editor store.\n\tsendEntityFocus(entity.uuid);\n\tsetDebugStore('debug', true);\n}\n\nexport const EntitiesSection: Component = () => {\n\tconst { stage } = useEditor();\n\n\treturn (\n\t\t<div class=\"panel-content\">\n\t\t\t<section class=\"zylem-section\">\n\t\t\t\t<h4 class=\"zylem-section-title\">Entities ({stage.entities.length})</h4>\n\t\t\t\t<div class=\"entity-grid\">\n\t\t\t\t\t<For each={stage.entities}>\n\t\t\t\t\t\t{(entity) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=\"entity-grid-item\"\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\tentity.name ? `${entity.name} (${entity.uuid})` : entity.uuid\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonClick={() => handleEntityClick(entity)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<EntityThumbnail\n\t\t\t\t\t\t\t\t\ttype={entity.type ?? 'Box'}\n\t\t\t\t\t\t\t\t\tname={entity.name}\n\t\t\t\t\t\t\t\t\tthumbnail={getEntityThumbnail(entity.uuid)?.url}\n\t\t\t\t\t\t\t\t\tbounds={getEntityThumbnail(entity.uuid)?.bounds ?? entity.bounds}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</For>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</div>\n\t);\n};\n","import type { Component } from 'solid-js';\nimport { Show } from 'solid-js';\nimport { EntityIcon } from './EntityIcon';\n\nexport interface EntityThumbnailProps {\n\ttype: string;\n\tname?: string | undefined;\n\tthumbnail?: string | null | undefined;\n\tbounds?: { width: number; height: number; depth: number } | undefined;\n}\n\nfunction formatDim(value: number): string {\n\tif (!Number.isFinite(value)) return '—';\n\tif (value >= 10) return value.toFixed(0);\n\tif (value >= 1) return value.toFixed(1);\n\treturn value.toFixed(2);\n}\n\n/**\n * Entity list preview: 3D thumbnail image (or type icon fallback) with\n * AABB dimension rulers along the bottom (width) and side (height).\n * Name caption overlays the bottom of the frame; rulers show on hover.\n */\nexport const EntityThumbnail: Component<EntityThumbnailProps> = (props) => {\n\tconst widthLabel = () => formatDim(props.bounds?.width ?? 0);\n\tconst heightLabel = () => formatDim(props.bounds?.height ?? 0);\n\tconst depthLabel = () => formatDim(props.bounds?.depth ?? 0);\n\tconst hasBounds = () => Boolean(props.bounds);\n\tconst caption = () => props.name ?? props.type;\n\n\treturn (\n\t\t<div class=\"entity-thumbnail\" title={props.name}>\n\t\t\t<div class=\"entity-thumbnail-frame\">\n\t\t\t\t<Show\n\t\t\t\t\twhen={props.thumbnail}\n\t\t\t\t\tfallback={<EntityIcon type={props.type} class=\"entity-icon\" />}\n\t\t\t\t>\n\t\t\t\t\t{(src) => (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tclass=\"entity-thumbnail-image\"\n\t\t\t\t\t\t\tsrc={src()}\n\t\t\t\t\t\t\talt={props.name ?? props.type}\n\t\t\t\t\t\t\tdraggable={false}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</Show>\n\t\t\t\t<span class=\"entity-grid-name\">{caption()}</span>\n\t\t\t\t<Show when={hasBounds()}>\n\t\t\t\t\t<div class=\"entity-ruler entity-ruler-bottom\" aria-hidden=\"true\">\n\t\t\t\t\t\t<span class=\"entity-ruler-ticks\" />\n\t\t\t\t\t\t<span class=\"entity-ruler-label\">{widthLabel()}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"entity-ruler entity-ruler-side\" aria-hidden=\"true\">\n\t\t\t\t\t\t<span class=\"entity-ruler-ticks\" />\n\t\t\t\t\t\t<span class=\"entity-ruler-label\">{heightLabel()}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"entity-ruler-depth\">d {depthLabel()}</span>\n\t\t\t\t</Show>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { Component } from 'solid-js';\nimport Box from 'lucide-solid/icons/box';\nimport Type from 'lucide-solid/icons/type';\nimport Square from 'lucide-solid/icons/square';\nimport Grid3x3 from 'lucide-solid/icons/grid-3x3';\nimport Torus from 'lucide-solid/icons/torus';\nimport PersonStanding from 'lucide-solid/icons/person-standing';\nimport GhostIcon from 'lucide-solid/icons/ghost';\nimport SquareDashed from 'lucide-solid/icons/square-dashed';\nimport Globe from 'lucide-solid/icons/globe';\n\n/**\n * Map entity type strings to lucide-solid icons.\n * Used as a fallback when a thumbnail preview is unavailable.\n */\nconst ICON_MAP: Record<string, Component<{ class?: string }>> = {\n\tBox: Box as Component<{ class?: string }>,\n\tSphere: Globe as Component<{ class?: string }>,\n\tDisk: Torus as Component<{ class?: string }>,\n\tSprite: GhostIcon as Component<{ class?: string }>,\n\tActor: PersonStanding as Component<{ class?: string }>,\n\tText: Type as Component<{ class?: string }>,\n\tRect: Square as Component<{ class?: string }>,\n\tPlane: Grid3x3 as Component<{ class?: string }>,\n\tZone: SquareDashed as Component<{ class?: string }>,\n};\n\nexport interface EntityIconProps {\n\ttype: string;\n\tclass?: string;\n}\n\n/**\n * Renders an icon based on entity type.\n * Falls back to Box icon for unknown types.\n */\nexport const EntityIcon: Component<EntityIconProps> = (props) => {\n\tconst IconComponent = ICON_MAP[props.type] ?? Box;\n\treturn <IconComponent class={props.class ?? 'entity-icon'} />;\n};\n","import { createMemo, For, Show, type Component } from 'solid-js';\n\nimport { useEditor } from '../EditorContext';\nimport { sendEntityTransform } from '../../bridge/editor-bridge';\nimport { setGridVisible, setSnapEnabled, transformStore } from './transform-state';\n\n/** Snap increments are world units, so 3 decimals is more than enough. */\nconst DECIMALS = 3;\n\ntype Axis = 'x' | 'y' | 'z';\ntype Channel = 'position' | 'rotation' | 'scale';\n\nconst AXES: Axis[] = ['x', 'y', 'z'];\n\nfunction round(value: number): number {\n\tconst factor = 10 ** DECIMALS;\n\treturn Math.round(value * factor) / factor;\n}\n\nfunction snap(value: number, increment: number): number {\n\tif (!transformStore.enabled || increment <= 0) return value;\n\treturn Math.round(value / increment) * increment;\n}\n\n/**\n * Numeric transform fields for the selected entity.\n *\n * Complements the gizmo rather than duplicating it: the gizmo is for coarse\n * placement, these fields for exact values. Both commit through the same bridge\n * message, and the game echoes an operation either way, so a typed value and a\n * drag land on one undo stack.\n */\nexport const TransformSection: Component = () => {\n\tconst { debug, stage } = useEditor();\n\n\tconst selected = createMemo(() => {\n\t\tconst uuid = debug.selectedEntityId;\n\t\tif (!uuid) return null;\n\t\treturn stage.entities.find((entity) => entity.uuid === uuid) ?? null;\n\t});\n\n\t/** Rotation is stored in radians but shown in degrees. */\n\tconst displayValue = (channel: Channel, axis: Axis): number => {\n\t\tconst entity = selected();\n\t\tif (!entity) return 0;\n\t\tif (channel === 'rotation') {\n\t\t\treturn round(((entity.rotation?.[axis] ?? 0) * 180) / Math.PI);\n\t\t}\n\t\tconst fallback = channel === 'scale' ? 1 : 0;\n\t\treturn round(entity[channel]?.[axis] ?? fallback);\n\t};\n\n\tconst commit = (channel: Channel, axis: Axis, raw: string): void => {\n\t\tconst entity = selected();\n\t\tif (!entity?.uuid) return;\n\n\t\tconst parsed = Number.parseFloat(raw);\n\t\tif (!Number.isFinite(parsed)) return;\n\n\t\tif (channel === 'rotation') {\n\t\t\tconst degreeSnap = (transformStore.rotate * 180) / Math.PI;\n\t\t\tconst radians = (snap(parsed, degreeSnap) * Math.PI) / 180;\n\t\t\tconst rotation = {\n\t\t\t\tx: entity.rotation?.x ?? 0,\n\t\t\t\ty: entity.rotation?.y ?? 0,\n\t\t\t\tz: entity.rotation?.z ?? 0,\n\t\t\t\t[axis]: radians,\n\t\t\t};\n\t\t\t// Euler only here: the field edits one axis at a time, which is exactly\n\t\t\t// what Euler angles express, and the game converts to a quaternion.\n\t\t\tsendEntityTransform(entity.uuid, { rotation });\n\t\t\treturn;\n\t\t}\n\n\t\tconst increment = channel === 'scale'\n\t\t\t? transformStore.scale\n\t\t\t: transformStore.translate;\n\t\tconst value = snap(parsed, increment);\n\n\t\tif (channel === 'scale') {\n\t\t\t// A zero scale collapses the collider into a degenerate shape the\n\t\t\t// physics runtime cannot solve.\n\t\t\tconst safe = value === 0 ? increment : value;\n\t\t\tsendEntityTransform(entity.uuid, {\n\t\t\t\tscale: {\n\t\t\t\t\tx: entity.scale?.x ?? 1,\n\t\t\t\t\ty: entity.scale?.y ?? 1,\n\t\t\t\t\tz: entity.scale?.z ?? 1,\n\t\t\t\t\t[axis]: safe,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tsendEntityTransform(entity.uuid, {\n\t\t\tposition: {\n\t\t\t\tx: entity.position?.x ?? 0,\n\t\t\t\ty: entity.position?.y ?? 0,\n\t\t\t\tz: entity.position?.z ?? 0,\n\t\t\t\t[axis]: value,\n\t\t\t},\n\t\t});\n\t};\n\n\tconst row = (channel: Channel, label: string) => (\n\t\t<div class=\"zylem-transform-row\">\n\t\t\t<span class=\"zylem-transform-row__label\">{label}</span>\n\t\t\t<For each={AXES}>\n\t\t\t\t{(axis) => (\n\t\t\t\t\t<input\n\t\t\t\t\t\tclass=\"zylem-transform-row__field\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tstep=\"any\"\n\t\t\t\t\t\taria-label={`${label} ${axis.toUpperCase()}`}\n\t\t\t\t\t\tvalue={displayValue(channel, axis)}\n\t\t\t\t\t\tonChange={(event) => commit(channel, axis, event.currentTarget.value)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</For>\n\t\t</div>\n\t);\n\n\treturn (\n\t\t<div class=\"panel-content\">\n\t\t\t<Show\n\t\t\t\twhen={selected()}\n\t\t\t\tfallback={\n\t\t\t\t\t<p class=\"zylem-transform-empty\">\n\t\t\t\t\t\tSelect an entity to edit its transform.\n\t\t\t\t\t</p>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<section>\n\t\t\t\t\t{row('position', 'Position')}\n\t\t\t\t\t{row('rotation', 'Rotation°')}\n\t\t\t\t\t{row('scale', 'Scale')}\n\t\t\t\t</section>\n\t\t\t</Show>\n\n\t\t\t<div class=\"zylem-transform-snap\">\n\t\t\t\t<label>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tchecked={transformStore.enabled}\n\t\t\t\t\t\tonChange={(event) => setSnapEnabled(event.currentTarget.checked)}\n\t\t\t\t\t/>\n\t\t\t\t\tSnap to grid\n\t\t\t\t</label>\n\t\t\t\t<label>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tchecked={transformStore.gridVisible}\n\t\t\t\t\t\tonChange={(event) => setGridVisible(event.currentTarget.checked)}\n\t\t\t\t\t/>\n\t\t\t\t\tShow grid\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<p class=\"zylem-transform-hint\">\n\t\t\t\tGrid: {transformStore.translate} units, {round((transformStore.rotate * 180) / Math.PI)}\n\t\t\t\t°, {transformStore.scale} scale. Hold Alt while dragging to move freely.\n\t\t\t</p>\n\t\t</div>\n\t);\n};\n","import { Console as UIConsole } from '@zylem/ui/components';\nimport { createSignal, onCleanup, type Component } from 'solid-js';\nimport { subscribe } from 'valtio/vanilla';\nimport { consoleState, clearConsole } from '..';\n\n/**\n * Console component displays an interactive console for debugging.\n */\nexport const Console: Component = () => {\n const [consoleContent, setConsoleContent] = createSignal(\n consoleState.messages.join('\\n'),\n );\n let previousMessageCount = consoleState.messages.length;\n\n // Subscribe to Valtio state changes and sync to Solid signal\n const unsubscribe = subscribe(consoleState, () => {\n const messages = consoleState.messages;\n const nextCount = messages.length;\n\n if (nextCount === 0) {\n if (previousMessageCount !== 0) {\n setConsoleContent('');\n }\n previousMessageCount = 0;\n return;\n }\n\n // Fast path: append only new messages instead of rebuilding the full string.\n if (nextCount > previousMessageCount) {\n const appendedText = messages.slice(previousMessageCount).join('\\n');\n if (previousMessageCount === 0) {\n setConsoleContent(appendedText);\n } else if (appendedText.length > 0) {\n setConsoleContent((prev) => `${prev}\\n${appendedText}`);\n }\n previousMessageCount = nextCount;\n return;\n }\n\n // Fallback for non-append mutations (replace/edit).\n setConsoleContent(messages.join('\\n'));\n previousMessageCount = nextCount;\n });\n\n onCleanup(() => {\n unsubscribe();\n });\n\n return (\n <UIConsole\n value={consoleContent()}\n onInput={setConsoleContent}\n onClear={clearConsole}\n />\n );\n};\n","import { Button } from '@zylem/ui/components';\nimport { For, Show, createSignal, onCleanup, onMount, type Component } from 'solid-js';\nimport { subscribe } from 'valtio/vanilla';\nimport {\n\tBRIDGE_RATE_WARNING,\n\tbridgePanelState,\n\tclearBridgeLog,\n\tformatBytes,\n\tsetBridgeCapturePaused,\n\tstartBridgeCapture,\n\tstopBridgeCapture,\n\ttype BridgeLogEntry,\n\ttype BridgeStatsRow,\n} from './bridge-panel-state';\n\n/**\n * Live view of editor ↔ game bridge traffic: per-type rates and volumes on\n * top, a rolling message log below. Capture starts when the panel mounts and\n * stops when it unmounts, so the tracer only runs while someone is watching.\n */\nexport const BridgePanel: Component = () => {\n\tconst [stats, setStats] = createSignal<BridgeStatsRow[]>([]);\n\tconst [entries, setEntries] = createSignal<BridgeLogEntry[]>([]);\n\tconst [paused, setPaused] = createSignal(bridgePanelState.paused);\n\tconst [dropped, setDropped] = createSignal(0);\n\n\tonMount(() => {\n\t\tstartBridgeCapture();\n\t\tconst unsubscribe = subscribe(bridgePanelState, () => {\n\t\t\tsetStats([...bridgePanelState.stats]);\n\t\t\tsetEntries([...bridgePanelState.entries]);\n\t\t\tsetPaused(bridgePanelState.paused);\n\t\t\tsetDropped(bridgePanelState.dropped);\n\t\t});\n\t\tonCleanup(() => {\n\t\t\tunsubscribe();\n\t\t\tstopBridgeCapture();\n\t\t});\n\t});\n\n\tconst togglePaused = () => setBridgeCapturePaused(!bridgePanelState.paused);\n\n\tconst totalRate = () =>\n\t\tstats().reduce((sum, row) => sum + row.rate, 0);\n\n\treturn (\n\t\t<div class=\"panel-content\">\n\t\t\t<section class=\"zylem-toolbar\">\n\t\t\t\t<Button size=\"sm\" onClick={togglePaused}>\n\t\t\t\t\t{paused() ? 'Resume' : 'Pause'}\n\t\t\t\t</Button>\n\t\t\t\t<Button size=\"sm\" onClick={clearBridgeLog}>\n\t\t\t\t\tClear\n\t\t\t\t</Button>\n\t\t\t\t<span class=\"zylem-property-value\">\n\t\t\t\t\t{totalRate().toFixed(0)} msg/s\n\t\t\t\t</span>\n\t\t\t</section>\n\n\t\t\t<Show\n\t\t\t\twhen={stats().length > 0}\n\t\t\t\tfallback={\n\t\t\t\t\t<p class=\"zylem-property-value\">\n\t\t\t\t\t\tNo bridge traffic recorded yet.\n\t\t\t\t\t</p>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<section class=\"zylem-section\">\n\t\t\t\t\t<h4 class=\"zylem-section-title\">Message types</h4>\n\t\t\t\t\t<div class=\"zylem-property-list\">\n\t\t\t\t\t\t<For each={stats()}>\n\t\t\t\t\t\t\t{(row) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclass=\"zylem-property-row\"\n\t\t\t\t\t\t\t\t\tclassList={{ 'bridge-row--hot': row.rate > BRIDGE_RATE_WARNING }}\n\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\t`sent ${row.sent} · queued ${row.queued} · `\n\t\t\t\t\t\t\t\t\t\t+ `delivered ${row.delivered} · `\n\t\t\t\t\t\t\t\t\t\t+ `coalesced ${(row.coalesced * 100).toFixed(0)}% · `\n\t\t\t\t\t\t\t\t\t\t+ `${row.listeners} listener(s) · `\n\t\t\t\t\t\t\t\t\t\t+ `${row.retained} retained`\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span class=\"zylem-property-label\">{row.type}</span>\n\t\t\t\t\t\t\t\t\t<span class=\"zylem-property-value\">\n\t\t\t\t\t\t\t\t\t\t{row.sent} · {row.rate.toFixed(0)}/s · {formatBytes(row.bytes)}\n\t\t\t\t\t\t\t\t\t\t{row.retained > 0 ? ` · ${row.retained} kept` : ''}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</For>\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\t\t\t</Show>\n\n\t\t\t<section class=\"zylem-section\">\n\t\t\t\t<h4 class=\"zylem-section-title\">\n\t\t\t\t\tRecent messages\n\t\t\t\t\t<Show when={dropped() > 0}>\n\t\t\t\t\t\t{' '}\n\t\t\t\t\t\t<span class=\"zylem-property-value\">({dropped()} older dropped)</span>\n\t\t\t\t\t</Show>\n\t\t\t\t</h4>\n\t\t\t\t<div class=\"bridge-log scrollable-y scroll-thin\">\n\t\t\t\t\t<For\n\t\t\t\t\t\teach={entries().slice().reverse()}\n\t\t\t\t\t\tfallback={<p class=\"zylem-property-value\">Waiting for messages…</p>}\n\t\t\t\t\t>\n\t\t\t\t\t\t{(entry) => (\n\t\t\t\t\t\t\t<div class=\"bridge-log-row\">\n\t\t\t\t\t\t\t\t<span class={`bridge-log-kind bridge-log-kind--${entry.kind}`}>\n\t\t\t\t\t\t\t\t\t{entry.kind}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span class=\"bridge-log-type\">{entry.type}</span>\n\t\t\t\t\t\t\t\t<span class=\"bridge-log-meta\">{formatBytes(entry.bytes)}</span>\n\t\t\t\t\t\t\t\t<span class=\"bridge-log-summary\">{entry.summary}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</For>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</div>\n\t);\n};\n","/**\n * Panel configuration for the accordion menu.\n * Defines all available panels and their components.\n */\n\nimport type { Component, JSX } from 'solid-js';\nimport { GameSection } from '../game/GameSection';\nimport { StageSection } from '../stages/StageSection';\nimport { EntitiesSection } from '../entities/EntitiesSection';\nimport { TransformSection } from '../transform/TransformSection';\nimport { Console } from '../console/Console';\nimport { BridgePanel } from '../bridge/BridgePanel';\n\nexport interface PanelConfig {\n id: string;\n title: string;\n component: Component;\n}\n\n/**\n * All available panels in the editor.\n * Order here is the default order.\n */\nexport const PANEL_CONFIGS: PanelConfig[] = [\n { id: 'game-config', title: 'Game', component: GameSection },\n { id: 'stage-config', title: 'Stage', component: StageSection },\n { id: 'entities', title: 'Entities', component: EntitiesSection },\n { id: 'transform', title: 'Transform', component: TransformSection },\n { id: 'console', title: 'Console', component: Console },\n { id: 'bridge', title: 'Bridge', component: BridgePanel },\n];\n\n/**\n * Get panel config by ID.\n */\nexport const getPanelConfig = (id: string): PanelConfig | undefined => {\n return PANEL_CONFIGS.find((p) => p.id === id);\n};\n\n/**\n * Get panel title by ID.\n */\nexport const getPanelTitle = (id: string): string => {\n return getPanelConfig(id)?.title ?? id;\n};\n\n/**\n * Render a panel's content by ID.\n */\nexport const renderPanelContent = (id: string): JSX.Element | null => {\n const config = getPanelConfig(id);\n if (!config) return null;\n const PanelComponent = config.component;\n return <PanelComponent />;\n};\n","/**\n * DraggableAccordionItem - Wrapper for accordion items that enables drag-to-detach and reorder.\n * \n * - Drag outside the menu panel → detaches into floating window\n * - Drag within the menu panel → reorders in the accordion\n * A ghost outline follows the cursor during drag.\n */\n\nimport { Accordion } from '@kobalte/core';\nimport { useLayer } from '@zylem/ui/components';\nimport { createSignal, onCleanup, onMount, Show, type Component, type JSX } from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { PANEL_RANK } from '../common/layer-ranks';\nimport {\n detachPanel,\n debugStore,\n setDraggingPanel,\n setDropTargetIndex,\n clearDragState,\n reorderPanels,\n} from '../editor-store';\n\n// Minimum drag distance before showing ghost\nconst DRAG_THRESHOLD = 5;\n\nexport interface DraggableAccordionItemProps {\n value: string;\n title: string;\n children: JSX.Element;\n}\n\nexport const DraggableAccordionItem: Component<DraggableAccordionItemProps> = (props) => {\n const layer = useLayer('panel', PANEL_RANK.dragGhost);\n let itemRef: HTMLDivElement | undefined;\n let headerRef: HTMLDivElement | undefined;\n let menuPanelRef: HTMLElement | null = null;\n\n const [isDragging, setIsDragging] = createSignal(false);\n const [ghostPos, setGhostPos] = createSignal({ x: 0, y: 0 });\n const [headerSize, setHeaderSize] = createSignal({ width: 0, height: 0 });\n\n let dragStartPos = { x: 0, y: 0 };\n let isPointerDown = false;\n\n // Get current index of this panel in the order\n const getCurrentIndex = () => {\n const detachedIds = Object.keys(debugStore.detachedPanels);\n const dockedPanels = debugStore.panelOrder.filter((id) => !detachedIds.includes(id));\n return dockedPanels.indexOf(props.value);\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n // Only start drag on left click\n if (e.button !== 0) return;\n\n isPointerDown = true;\n dragStartPos = { x: e.clientX, y: e.clientY };\n\n // Find the menu panel parent for bounds checking\n menuPanelRef = itemRef?.closest('.floating-panel') as HTMLElement | null;\n\n // Capture header size for ghost\n if (headerRef) {\n const rect = headerRef.getBoundingClientRect();\n setHeaderSize({ width: rect.width, height: rect.height });\n }\n\n // Prevent default on mouse to avoid text selection, but allow touch to propagate for clicks\n // (scrolling is handled by touch-action: none)\n if (e.pointerType === 'mouse') {\n e.preventDefault();\n }\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n if (!isPointerDown) return;\n\n const deltaX = e.clientX - dragStartPos.x;\n const deltaY = e.clientY - dragStartPos.y;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n // Start showing ghost after small movement\n if (distance > DRAG_THRESHOLD && !isDragging()) {\n setIsDragging(true);\n setDraggingPanel(props.value);\n }\n\n if (isDragging()) {\n // Update ghost position to follow cursor\n setGhostPos({\n x: e.clientX - headerSize().width / 2,\n y: e.clientY - 15,\n });\n\n // Check if over the accordion and determine drop index\n if (menuPanelRef) {\n const panelRect = menuPanelRef.getBoundingClientRect();\n const isInsidePanel =\n e.clientX >= panelRect.left &&\n e.clientX <= panelRect.right &&\n e.clientY >= panelRect.top &&\n e.clientY <= panelRect.bottom;\n\n if (isInsidePanel) {\n // Find accordion and calculate drop index\n const accordion = menuPanelRef.querySelector('.zylem-accordion');\n if (accordion) {\n const accordionItems = accordion.querySelectorAll('.accordion-item');\n let dropIndex = 0;\n\n for (let i = 0; i < accordionItems.length; i++) {\n const item = accordionItems[i];\n if (!item) continue;\n const itemRect = item.getBoundingClientRect();\n const itemMiddle = itemRect.top + itemRect.height / 2;\n if (e.clientY > itemMiddle) {\n dropIndex = i + 1;\n }\n }\n setDropTargetIndex(dropIndex);\n }\n } else {\n setDropTargetIndex(null);\n }\n }\n }\n };\n\n const handlePointerUp = (e: PointerEvent) => {\n if (!isPointerDown) return;\n\n const wasDragging = isDragging();\n isPointerDown = false;\n setIsDragging(false);\n\n if (wasDragging && menuPanelRef) {\n // Check if cursor is outside the menu panel\n const panelRect = menuPanelRef.getBoundingClientRect();\n const isOutside =\n e.clientX < panelRect.left ||\n e.clientX > panelRect.right ||\n e.clientY < panelRect.top ||\n e.clientY > panelRect.bottom;\n\n if (isOutside) {\n // Detach the panel at the current mouse position\n detachPanel(props.value, {\n x: e.clientX - 175,\n y: e.clientY - 20,\n });\n } else {\n // Reorder within the panel\n const dropIndex = debugStore.dropTargetIndex;\n if (dropIndex !== null) {\n const currentIndex = getCurrentIndex();\n if (dropIndex !== currentIndex && dropIndex !== currentIndex + 1) {\n // Calculate new order\n const detachedIds = Object.keys(debugStore.detachedPanels);\n const dockedPanels = debugStore.panelOrder.filter((id) => !detachedIds.includes(id));\n\n // Remove current item\n const newOrder = dockedPanels.filter((id) => id !== props.value);\n\n // Adjust insert index if we're moving down\n let insertIndex = dropIndex;\n if (dropIndex > currentIndex) {\n insertIndex = dropIndex - 1;\n }\n\n // Insert at new position\n newOrder.splice(insertIndex, 0, props.value);\n\n // Update store with full panel order (including detached)\n const fullOrder = [...newOrder];\n // Add back detached panels at their original positions\n debugStore.panelOrder.forEach((id) => {\n if (detachedIds.includes(id) && !fullOrder.includes(id)) {\n fullOrder.push(id);\n }\n });\n\n reorderPanels(fullOrder);\n }\n }\n }\n }\n\n clearDragState();\n };\n\n onMount(() => {\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n });\n\n onCleanup(() => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n });\n\n return (\n <>\n <Accordion.Item\n ref={itemRef}\n value={props.value}\n class={`accordion-item ${isDragging() ? 'accordion-item--dragging' : ''}`}\n >\n <Accordion.Header\n ref={headerRef}\n class=\"accordion-header\"\n onPointerDown={handlePointerDown}\n style={{ \"touch-action\": \"none\" }}\n >\n <Accordion.Trigger class=\"accordion-trigger zylem-exo-2\">\n {props.title}\n </Accordion.Trigger>\n </Accordion.Header>\n <Accordion.Content class=\"accordion-content scrollable-y scroll-thin\">\n {props.children}\n </Accordion.Content>\n </Accordion.Item>\n\n {/*\n Ghost outline that follows the cursor during a drag. Portaled to\n escape the panel's clipping, into the layer container so it stays in\n the tree the editor's styles were injected into.\n */}\n <Show when={isDragging() && layer.mount()}>\n <Portal mount={layer.mount()!}>\n <div\n class=\"accordion-drag-ghost\"\n style={{\n position: 'fixed',\n left: `${ghostPos().x}px`,\n top: `${ghostPos().y}px`,\n width: `${headerSize().width}px`,\n height: `${headerSize().height}px`,\n 'z-index': layer.zIndex(),\n 'pointer-events': 'none',\n display: 'flex',\n 'align-items': 'center',\n 'justify-content': 'space-between',\n background: 'rgba(10, 20, 30, 0.54)',\n border: '2px dotted #E64534',\n 'border-radius': '12px',\n color: '#61A6E8',\n 'font-family': \"'Exo 2', sans-serif\",\n 'backdrop-filter': 'blur(8px)',\n 'box-shadow': '0 8px 24px rgba(0, 0, 0, 0.5), 0 0 0 1px #E64534',\n }}\n >\n <span\n class=\"accordion-trigger zylem-exo-2\"\n style={{\n 'font-family': \"'Exo 2', sans-serif\",\n 'font-weight': 400,\n padding: '8px 12px',\n }}\n >\n {props.title}\n </span>\n </div>\n </Portal>\n </Show>\n </>\n );\n};\n","/**\n * How the editor's own chrome orders itself inside @zylem/ui's `panel` tier.\n *\n * These are rank offsets, not z-indexes: each is added to `--zylem-layer-panel`,\n * so the whole group moves together if the ladder is ever re-cut, and overlays on\n * higher tiers (menus, tooltips, dialogs) stay above all of it by construction.\n * The values are small and well under the 1000-wide band, so no panel can climb\n * into the next tier however many are open.\n */\nexport const PANEL_RANK = {\n\t/** The launcher, which a panel is allowed to cover. */\n\ttoggleButton: 1,\n\tmainPanel: 2,\n\t/** Detached panels add their index in `panelZOrder`, so clicking raises. */\n\tdetachedBase: 3,\n\t/**\n\t * Dock preview for the main panel. Detached panels derive theirs from their\n\t * own rank instead, since they can already be above this.\n\t */\n\tmainDockPreview: 4,\n\t/**\n\t * The ghost that follows the cursor while a section is being torn out. Above\n\t * every panel, including the one it came from, but still page furniture, so it\n\t * stays below menus and dialogs.\n\t */\n\tdragGhost: 900,\n} as const;\n","import { useLayer } from '@zylem/ui/components';\nimport { createSignal, onCleanup, onMount, type Component } from 'solid-js';\nimport { setToggleButtonPosition } from '.';\nimport { PANEL_RANK } from './common/layer-ranks';\n\n// Corner snap threshold in pixels\nconst SNAP_THRESHOLD = 50;\n// Minimum movement to consider as drag (not click)\nconst DRAG_THRESHOLD = 5;\n// Button size matches --zylem-size-icon-lg in CSS\nconst BUTTON_SIZE = 96;\nconst BUTTON_MARGIN = 20;\n\ninterface EditorToggleButtonProps {\n onToggle: () => void;\n}\n\n/**\n * Draggable toggle button for the editor panel.\n * Supports click to toggle and drag to reposition.\n * Snaps to corners when released near edges.\n */\nexport const EditorToggleButton: Component<EditorToggleButtonProps> = (\n props,\n) => {\n const layer = useLayer('panel', PANEL_RANK.toggleButton);\n // Initial position will be set on mount to bottom-right corner\n const [position, setPosition] = createSignal({ x: 0, y: 0 });\n let resizeRaf: number | undefined;\n\n let isDragging = false;\n let dragStartPos = { x: 0, y: 0 };\n let buttonStartPos = { x: 0, y: 0 };\n let hasMoved = false;\n\n const snapToCorner = (x: number, y: number) => {\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n\n let snappedX = x;\n let snappedY = y;\n\n // Snap to left edge\n if (x < SNAP_THRESHOLD) {\n snappedX = BUTTON_MARGIN;\n }\n // Snap to right edge\n else if (x > windowWidth - BUTTON_SIZE - SNAP_THRESHOLD) {\n snappedX = windowWidth - BUTTON_SIZE - BUTTON_MARGIN;\n }\n\n // Snap to top edge\n if (y < SNAP_THRESHOLD) {\n snappedY = BUTTON_MARGIN;\n }\n // Snap to bottom edge\n else if (y > windowHeight - BUTTON_SIZE - SNAP_THRESHOLD) {\n snappedY = windowHeight - BUTTON_SIZE - BUTTON_MARGIN;\n }\n\n return { x: snappedX, y: snappedY };\n };\n\n const clampToViewport = (x: number, y: number) => {\n const maxX = Math.max(0, window.innerWidth - BUTTON_SIZE);\n const maxY = Math.max(0, window.innerHeight - BUTTON_SIZE);\n return {\n x: Math.max(0, Math.min(x, maxX)),\n y: Math.max(0, Math.min(y, maxY)),\n };\n };\n\n const handlePointerDown = (e: PointerEvent) => {\n isDragging = true;\n hasMoved = false;\n dragStartPos = { x: e.clientX, y: e.clientY };\n buttonStartPos = { ...position() };\n\n // Prevent default on mouse to avoid selection, but allow touch actions if needed\n // though touch-action: none handles the scrolling prevention\n if (e.pointerType === 'mouse') {\n e.preventDefault();\n }\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n if (!isDragging) return;\n\n const deltaX = e.clientX - dragStartPos.x;\n const deltaY = e.clientY - dragStartPos.y;\n\n // Check if we've moved enough to consider it a drag\n if (\n Math.abs(deltaX) > DRAG_THRESHOLD ||\n Math.abs(deltaY) > DRAG_THRESHOLD\n ) {\n hasMoved = true;\n }\n\n if (hasMoved) {\n const newX = buttonStartPos.x + deltaX;\n const newY = buttonStartPos.y + deltaY;\n\n // Clamp to window bounds\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n\n const clampedX = Math.max(0, Math.min(newX, windowWidth - BUTTON_SIZE));\n const clampedY = Math.max(0, Math.min(newY, windowHeight - BUTTON_SIZE));\n\n setPosition({ x: clampedX, y: clampedY });\n }\n };\n\n const handlePointerUp = () => {\n if (isDragging) {\n if (hasMoved) {\n // Snap to corner on release\n const currentPos = position();\n const snappedPos = snapToCorner(currentPos.x, currentPos.y);\n setPosition(snappedPos);\n setToggleButtonPosition(snappedPos);\n } else {\n // It was a click, not a drag\n props.onToggle();\n }\n isDragging = false;\n hasMoved = false;\n }\n };\n\n const handleResize = () => {\n if (resizeRaf !== undefined) {\n cancelAnimationFrame(resizeRaf);\n }\n resizeRaf = requestAnimationFrame(() => {\n const currentPos = position();\n const clampedPos = clampToViewport(currentPos.x, currentPos.y);\n if (clampedPos.x !== currentPos.x || clampedPos.y !== currentPos.y) {\n setPosition(clampedPos);\n setToggleButtonPosition(clampedPos);\n }\n resizeRaf = undefined;\n });\n };\n\n onMount(() => {\n // Set initial position to bottom-right corner\n const initialPos = clampToViewport(\n window.innerWidth - BUTTON_SIZE - BUTTON_MARGIN,\n window.innerHeight - BUTTON_SIZE - BUTTON_MARGIN,\n );\n setPosition(initialPos);\n setToggleButtonPosition(initialPos);\n\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('resize', handleResize);\n });\n\n onCleanup(() => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('resize', handleResize);\n if (resizeRaf !== undefined) {\n cancelAnimationFrame(resizeRaf);\n }\n });\n\n return (\n <div\n style={{\n position: 'fixed',\n left: `${position().x}px`,\n top: `${position().y}px`,\n 'z-index': layer.zIndex(),\n cursor: 'grab',\n 'touch-action': 'none',\n 'pointer-events': 'auto',\n }}\n >\n <button\n id=\"zylem-editor-toggle\"\n type=\"button\"\n onPointerDown={handlePointerDown}\n />\n </div>\n );\n};\n","import {\n createEffect,\n createSignal,\n onCleanup,\n onMount,\n Show,\n type JSX,\n type Component,\n type Accessor,\n} from 'solid-js';\nimport { useLayer, WindowControls } from '@zylem/ui/components';\nimport { DockMenu } from './DockMenu';\nimport { PANEL_RANK } from './layer-ranks';\nimport { createPanelDocking, DockPreviewOverlay, type ResizeMode } from './panel-docking';\nimport { isHorizontalSide, type DockSide } from './dock-layout';\nimport { MAIN_PANEL_ID } from '../editor-store';\n\n// Minimum drag threshold to distinguish from clicks\nconst DRAG_THRESHOLD = 3;\n\ntype ResizeDirection = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw' | null;\n\n/** An imperative dock command; the nonce lets the same side be re-sent. */\nexport interface DockRequest {\n side: DockSide | null;\n nonce: number;\n}\n\nexport interface FloatingPanelProps {\n title?: string;\n initialPosition?: { x: number; y: number };\n initialSize?: { width: number; height: number };\n /**\n * Size the panel should restore to when it floats. `initialSize` can be a\n * docked rect when the panel mounts docked, so it must not seed the\n * floating-size memory.\n */\n floatingSize?: { width: number; height: number };\n minSize?: { width: number; height: number };\n collapsible?: boolean;\n onClose?: () => void;\n onMove?: (position: { x: number; y: number }) => void;\n onResize?: (size: { width: number; height: number }) => void;\n dockRequest?: Accessor<DockRequest | null>;\n children: JSX.Element | ((isCollapsed: Accessor<boolean>) => JSX.Element);\n}\n\n/**\n * FloatingPanel - A draggable and resizable container component.\n * Can be moved by dragging the title bar and resized from edges/corners.\n * Dragging it past a viewport edge docks it; see `panel-docking`.\n */\nexport const FloatingPanel: Component<FloatingPanelProps> = (props) => {\n const layer = useLayer('panel', PANEL_RANK.mainPanel);\n const minSize = props.minSize ?? { width: 300, height: 200 };\n const initialPanelSize = props.initialSize ?? { width: 460, height: 600 };\n\n const [position, setPosition] = createSignal(\n props.initialPosition ?? { x: 50, y: 50 }\n );\n const [size, setSize] = createSignal(\n initialPanelSize\n );\n const [isCollapsed, setIsCollapsed] = createSignal(false);\n\n const toggleCollapse = () => setIsCollapsed(!isCollapsed());\n\n let isDragging = false;\n let isResizing = false;\n let resizeMode: ResizeMode = 'free';\n let resizeDirection: ResizeDirection = null;\n let dragStartPos = { x: 0, y: 0 };\n let panelStartPos = { x: 0, y: 0 };\n let panelStartSize = { width: 0, height: 0 };\n let startThickness = 0;\n let hasMoved = false;\n let panelRef: HTMLDivElement | undefined;\n\n const {\n dockedSide,\n isAutoHeight,\n showDockPreview,\n hideDockPreview,\n rememberUndockedSize,\n getLiveSize,\n getDockPreviewRect,\n detectDockSide,\n detectDockIndex,\n beginDragGhost,\n endDragGhost,\n isMoving,\n clampSizeToViewport,\n beginResize,\n resizeDockThickness,\n applyDockPreview,\n dockTo,\n } = createPanelDocking({\n panelId: MAIN_PANEL_ID,\n initialSize: props.floatingSize ?? initialPanelSize,\n minSize,\n position,\n setPosition,\n size,\n setSize,\n panelRef: () => panelRef,\n onPositionCommit: (nextPosition) => props.onMove?.(nextPosition),\n onSizeCommit: (nextSize) => props.onResize?.(nextSize),\n });\n\n // Host-driven dock commands (toolbar buttons, postMessage from a shell).\n createEffect(() => {\n const request = props.dockRequest?.();\n if (!request) return;\n dockTo(request.side);\n });\n\n // Clamp position to keep panel visible in viewport\n const clampPosition = (x: number, y: number, width: number, height: number) => {\n const padding = 50; // Keep at least this much visible\n return {\n x: Math.max(-width + padding, Math.min(x, window.innerWidth - padding)),\n y: Math.max(0, Math.min(y, window.innerHeight - padding)),\n };\n };\n\n // Clamp size to minimum and viewport bounds\n const clampSize = (width: number, height: number) => clampSizeToViewport(width, height);\n\n const handleTitleBarPointerDown = (e: PointerEvent) => {\n isDragging = true;\n hasMoved = false;\n hideDockPreview();\n dragStartPos = { x: e.clientX, y: e.clientY };\n panelStartPos = { ...position() };\n \n // Prevent default on mouse to avoid selection, but allow touch actions if needed\n // though touch-action: none handles the scrolling prevention\n if (e.pointerType === 'mouse') {\n e.preventDefault();\n }\n };\n\n const handleResizePointerDown = (direction: ResizeDirection) => (e: PointerEvent) => {\n isResizing = true;\n resizeDirection = direction;\n const side = dockedSide();\n const { size: currentSize, mode } = beginResize(direction);\n resizeMode = mode;\n // A thickness resize measures from the zone's current extent, not the\n // panel box, since every panel in the zone shares it.\n startThickness = side && isHorizontalSide(side) ? currentSize.width : currentSize.height;\n dragStartPos = { x: e.clientX, y: e.clientY };\n panelStartPos = { ...position() };\n panelStartSize = { ...currentSize };\n \n if (e.pointerType === 'mouse') {\n e.preventDefault();\n }\n e.stopPropagation();\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n if (isDragging) {\n let deltaX = e.clientX - dragStartPos.x;\n let deltaY = e.clientY - dragStartPos.y;\n\n if (Math.abs(deltaX) > DRAG_THRESHOLD || Math.abs(deltaY) > DRAG_THRESHOLD) {\n if (!hasMoved) {\n hasMoved = true;\n // Every move happens through the small ghost, docked or not.\n const fitted = beginDragGhost(e.clientX, e.clientY);\n dragStartPos = { x: e.clientX, y: e.clientY };\n panelStartPos = { ...fitted.position };\n panelStartSize = { ...fitted.size };\n deltaX = 0;\n deltaY = 0;\n }\n }\n\n if (hasMoved) {\n const proposedX = panelStartPos.x + deltaX;\n const proposedY = panelStartPos.y + deltaY;\n const liveSize = getLiveSize();\n\n const dockSide = detectDockSide(\n proposedX,\n proposedY,\n liveSize.width,\n liveSize.height,\n );\n if (dockSide) {\n showDockPreview(dockSide, detectDockIndex(dockSide, e.clientX, e.clientY));\n } else {\n hideDockPreview();\n }\n\n const newPos = clampPosition(\n proposedX,\n proposedY,\n liveSize.width,\n liveSize.height\n );\n setPosition(newPos);\n }\n } else if (isResizing && resizeDirection) {\n const deltaX = e.clientX - dragStartPos.x;\n const deltaY = e.clientY - dragStartPos.y;\n\n // While docked, the only free dimension is the zone's thickness;\n // position and cross-axis extent come from the dock layout.\n if (resizeMode === 'thickness') {\n resizeDockThickness(startThickness, deltaX, deltaY);\n return;\n }\n\n let newWidth = panelStartSize.width;\n let newHeight = panelStartSize.height;\n let newX = panelStartPos.x;\n let newY = panelStartPos.y;\n\n // Handle horizontal resizing\n if (resizeDirection.includes('e')) {\n newWidth = panelStartSize.width + deltaX;\n } else if (resizeDirection.includes('w')) {\n newWidth = panelStartSize.width - deltaX;\n newX = panelStartPos.x + deltaX;\n }\n\n // Handle vertical resizing\n if (resizeDirection.includes('s')) {\n newHeight = panelStartSize.height + deltaY;\n } else if (resizeDirection.includes('n')) {\n newHeight = panelStartSize.height - deltaY;\n newY = panelStartPos.y + deltaY;\n }\n\n // Apply minimum size constraints\n const clampedSize = clampSize(newWidth, newHeight);\n\n // Adjust position if we hit minimum size when resizing from top/left\n if (resizeDirection.includes('w') && clampedSize.width === minSize.width) {\n newX = panelStartPos.x + panelStartSize.width - minSize.width;\n }\n if (resizeDirection.includes('n') && clampedSize.height === minSize.height) {\n newY = panelStartPos.y + panelStartSize.height - minSize.height;\n }\n\n setSize(clampedSize);\n setPosition(clampPosition(newX, newY, clampedSize.width, clampedSize.height));\n }\n };\n\n const handlePointerUp = () => {\n if (isDragging && hasMoved) {\n if (applyDockPreview()) {\n // Docking state and callbacks are handled by the shared controller.\n } else {\n // Drop the ghost: restores the pre-drag size and commits\n // position/size through the controller callbacks.\n endDragGhost();\n }\n }\n\n // A thickness resize keeps the panel docked; its extent already lives in\n // the registry, so only a free resize reports a floating size.\n if (isResizing && resizeMode === 'free') {\n rememberUndockedSize(size());\n props.onResize?.(size());\n }\n\n isDragging = false;\n isResizing = false;\n resizeMode = 'free';\n resizeDirection = null;\n hasMoved = false;\n hideDockPreview();\n };\n\n onMount(() => {\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n });\n\n onCleanup(() => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n });\n\n const resizeHandleStyle = (cursor: string): JSX.CSSProperties => ({\n position: 'absolute',\n 'z-index': 10,\n cursor,\n 'touch-action': 'none',\n });\n\n return (\n <div\n class=\"floating-panel\"\n ref={panelRef}\n style={{\n position: 'fixed',\n left: `${position().x}px`,\n top: `${position().y}px`,\n width: `${size().width}px`,\n height:\n !isMoving() && (isCollapsed() || isAutoHeight())\n ? 'auto'\n : `${size().height}px`,\n 'z-index': layer.zIndex(),\n display: 'flex',\n 'flex-direction': 'column',\n 'border-radius': dockedSide() ? '0' : undefined,\n // The editor overlay root is pointer-events: none; re-enable\n // interaction for the panel itself.\n 'pointer-events': 'auto',\n // While being moved the panel is just a transparent outline.\n ...(isMoving()\n ? {\n background: 'transparent',\n 'backdrop-filter': 'none',\n '-webkit-backdrop-filter': 'none',\n 'box-shadow': 'none',\n border: '2px solid var(--zylem-color-primary, #61a6e8)',\n }\n : {}),\n }}\n >\n <DockPreviewOverlay\n rect={getDockPreviewRect()}\n rank={PANEL_RANK.mainDockPreview}\n />\n\n {/* Title bar */}\n <div\n class=\"floating-panel-titlebar\"\n style={{\n cursor: 'grab',\n display: 'flex',\n 'align-items': 'center',\n 'justify-content': 'space-between',\n 'user-select': 'none',\n 'touch-action': 'none',\n 'border-radius': dockedSide() ? '0' : undefined,\n visibility: isMoving() ? 'hidden' : undefined,\n }}\n onPointerDown={handleTitleBarPointerDown}\n >\n <span class=\"floating-panel-title\">{props.title ?? 'Panel'}</span>\n <div style={{ display: 'flex', 'align-items': 'center', gap: '7px' }}>\n <DockMenu dockedSide={dockedSide} onDock={(side) => dockTo(side)} />\n <WindowControls\n collapsed={isCollapsed()}\n onCollapse={props.collapsible ? toggleCollapse : undefined}\n onClose={props.onClose}\n closeTestId=\"floating-panel-close\"\n />\n </div>\n </div>\n\n {/* Content area */}\n <div\n class=\"floating-panel-content\"\n style={{\n flex: 1,\n overflow: 'hidden',\n display: 'flex',\n 'flex-direction': 'column',\n visibility: isMoving() ? 'hidden' : undefined,\n }}\n >\n {typeof props.children === 'function'\n ? props.children(isCollapsed)\n : props.children}\n </div>\n\n {/* Resize handles - edges */}\n <div\n style={{ ...resizeHandleStyle('ns-resize'), top: 0, left: '10px', right: '10px', height: '6px' }}\n onPointerDown={handleResizePointerDown('n')}\n />\n <div\n style={{ ...resizeHandleStyle('ns-resize'), bottom: 0, left: '10px', right: '10px', height: '6px' }}\n onPointerDown={handleResizePointerDown('s')}\n />\n <div\n style={{ ...resizeHandleStyle('ew-resize'), left: 0, top: '10px', bottom: '10px', width: '6px' }}\n onPointerDown={handleResizePointerDown('w')}\n />\n <div\n style={{ ...resizeHandleStyle('ew-resize'), right: 0, top: '10px', bottom: '10px', width: '6px' }}\n onPointerDown={handleResizePointerDown('e')}\n />\n\n {/* Resize handles - corners */}\n <div\n style={{ ...resizeHandleStyle('nwse-resize'), top: 0, left: 0, width: '10px', height: '10px' }}\n onPointerDown={handleResizePointerDown('nw')}\n />\n <div\n style={{ ...resizeHandleStyle('nesw-resize'), top: 0, right: 0, width: '10px', height: '10px' }}\n onPointerDown={handleResizePointerDown('ne')}\n />\n <div\n style={{ ...resizeHandleStyle('nesw-resize'), bottom: 0, left: 0, width: '10px', height: '10px' }}\n onPointerDown={handleResizePointerDown('sw')}\n />\n <div\n style={{ ...resizeHandleStyle('nwse-resize'), bottom: 0, right: 0, width: '10px', height: '10px' }}\n onPointerDown={handleResizePointerDown('se')}\n />\n </div>\n );\n};\n","import {\n createEffect,\n createSignal,\n For,\n onCleanup,\n Show,\n type Accessor,\n type Component,\n} from 'solid-js';\nimport { Dynamic, Portal } from 'solid-js/web';\nimport { useLayer } from '@zylem/ui/components';\nimport { PanelBottom, PanelLeft, PanelRight, PanelTop } from 'lucide-solid';\nimport type { DockSide } from './dock-layout';\n\nconst DOCK_OPTIONS: Array<{\n side: DockSide;\n label: string;\n icon: typeof PanelLeft;\n}> = [\n { side: 'left', label: 'Dock to left', icon: PanelLeft },\n { side: 'top', label: 'Dock to top', icon: PanelTop },\n { side: 'bottom', label: 'Dock to bottom', icon: PanelBottom },\n { side: 'right', label: 'Dock to right', icon: PanelRight },\n];\n\nexport interface DockMenuProps {\n dockedSide: Accessor<DockSide | null>;\n onDock: (side: DockSide) => void;\n}\n\n/**\n * Chrome-DevTools-style dock picker for the panel titlebar: one trigger button\n * opening a row of dock-side options. Floating the panel is done by dragging it\n * away from an edge.\n *\n * The menu is portaled to the `menu` layer rather than positioned inside the\n * titlebar, because the panel clips its overflow — an inline menu was cut off at\n * the panel edge no matter what z-index it carried. Portaling costs us CSS\n * anchoring, so the position is measured from the trigger instead.\n */\nexport const DockMenu: Component<DockMenuProps> = (props) => {\n const [open, setOpen] = createSignal(false);\n const [anchor, setAnchor] = createSignal({ top: 0, right: 0 });\n const layer = useLayer('menu');\n let wrapperRef: HTMLDivElement | undefined;\n let triggerRef: HTMLButtonElement | undefined;\n let menuRef: HTMLDivElement | undefined;\n\n /**\n * The wrapper serves two purposes: it anchors the layer lookup, and it is the\n * subtree an outside-press test has to exclude. Assigned during render rather\n * than on mount, because `useLayer` resolves its container on mount and would\n * otherwise find no anchor.\n */\n const attachWrapper = (element: HTMLDivElement) => {\n wrapperRef = element;\n layer.anchorRef(element);\n };\n\n const triggerIcon = () =>\n DOCK_OPTIONS.find((option) => option.side === props.dockedSide())?.icon ?? PanelRight;\n\n /** Right-aligned under the trigger, matching where the inline menu sat. */\n const measure = () => {\n if (!triggerRef) return;\n const rect = triggerRef.getBoundingClientRect();\n setAnchor({\n top: rect.bottom + 6,\n right: Math.max(0, window.innerWidth - rect.right),\n });\n };\n\n const toggle = () => {\n if (!open()) measure();\n setOpen(!open());\n };\n\n // Close on pointerdown outside the menu. Membership is checked via\n // composedPath: the wrapper's stopPropagation runs in Solid's DELEGATED\n // handler, i.e. only once the native event has already reached the\n // document, so this same-node listener still fires for inside presses —\n // closing on those would unmount an option before its click can land. The\n // menu is portaled out of the wrapper, so it has to be tested separately.\n createEffect(() => {\n if (!open()) return;\n const onOutsidePointerDown = (event: PointerEvent) => {\n const path = event.composedPath();\n if (wrapperRef && path.includes(wrapperRef)) return;\n if (menuRef && path.includes(menuRef)) return;\n setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n document.addEventListener('pointerdown', onOutsidePointerDown);\n document.addEventListener('keydown', onKeyDown);\n // A portaled menu no longer moves with its trigger, so re-measure rather\n // than leaving it stranded where the trigger used to be.\n window.addEventListener('resize', measure);\n onCleanup(() => {\n document.removeEventListener('pointerdown', onOutsidePointerDown);\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', measure);\n });\n });\n\n return (\n <div\n ref={attachWrapper}\n style={{ display: 'inline-flex' }}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <button\n type=\"button\"\n ref={triggerRef}\n class=\"floating-panel-button\"\n title=\"Dock panel\"\n aria-label=\"Dock panel\"\n aria-haspopup=\"true\"\n aria-expanded={open()}\n data-testid=\"dock-menu-trigger\"\n onClick={toggle}\n >\n <Dynamic component={triggerIcon()} size={12} />\n </button>\n <Show when={open() && layer.mount()}>\n <Portal mount={layer.mount()!}>\n <div\n ref={menuRef}\n role=\"menu\"\n aria-label=\"Dock panel to edge\"\n onPointerDown={(event) => event.stopPropagation()}\n style={{\n position: 'fixed',\n top: `${anchor().top}px`,\n right: `${anchor().right}px`,\n display: 'flex',\n gap: '6px',\n padding: '6px',\n 'border-radius': '6px',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n background: 'rgba(10, 20, 30, 0.92)',\n 'box-shadow': '0 4px 14px rgba(0, 0, 0, 0.45)',\n 'z-index': layer.zIndex(),\n // The editor overlay root is pointer-events: none.\n 'pointer-events': 'auto',\n }}\n >\n <For each={DOCK_OPTIONS}>\n {(option) => {\n const active = () => props.dockedSide() === option.side;\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"floating-panel-button\"\n title={option.label}\n aria-label={option.label}\n data-testid={`dock-menu-${option.side}`}\n style={{\n 'border-color': active()\n ? 'var(--zylem-color-primary, #61a6e8)'\n : undefined,\n background: active()\n ? 'rgba(97, 166, 232, 0.4)'\n : undefined,\n }}\n onClick={() => {\n props.onDock(option.side);\n setOpen(false);\n }}\n >\n <Dynamic component={option.icon} size={12} />\n </button>\n );\n }}\n </For>\n </div>\n </Portal>\n </Show>\n </div>\n );\n};\n","import {\n createEffect,\n createMemo,\n createSignal,\n Show,\n untrack,\n type Accessor,\n type Component,\n type Setter,\n} from 'solid-js';\nimport { Portal } from 'solid-js/web';\nimport { useLayer } from '@zylem/ui/components';\nimport {\n clampThickness,\n computeDockLayout,\n dockSlotIndex,\n findDockedSide,\n innerEdgeFor,\n isHorizontalSide,\n previewDockRect,\n type DockPanelId,\n type DockRect,\n type DockSide,\n} from './dock-layout';\nimport { viewportSize } from './viewport';\nimport {\n debugStore,\n dockPanelToSide,\n setDockThickness,\n undockPanelFromSides,\n} from '../editor-store';\n\nconst SNAP_PREVIEW_THRESHOLD = 24;\n\n/** Fixed footprint every panel shrinks to while it is being moved. */\nconst GHOST_SIZE: PanelSize = { width: 320, height: 240 };\n\nexport type { DockSide, DockRect } from './dock-layout';\n\nexport interface PanelPosition {\n x: number;\n y: number;\n}\n\nexport interface PanelSize {\n width: number;\n height: number;\n}\n\ninterface DockPreviewState {\n visible: boolean;\n side: DockSide | null;\n index: number;\n}\n\ninterface FittedPanel {\n position: PanelPosition;\n size: PanelSize;\n}\n\nexport type ResizeMode = 'free' | 'thickness';\n\ninterface CreatePanelDockingOptions {\n /** Registry id: `'main'` for the editor panel, otherwise a section id. */\n panelId: DockPanelId;\n initialSize: PanelSize;\n minSize: PanelSize;\n position: Accessor<PanelPosition>;\n setPosition: Setter<PanelPosition>;\n size: Accessor<PanelSize>;\n setSize: Setter<PanelSize>;\n panelRef: Accessor<HTMLDivElement | undefined>;\n onPositionCommit?: (position: PanelPosition) => void;\n onSizeCommit?: (size: PanelSize) => void;\n}\n\n/**\n * Docking behavior shared by the editor's floating panels.\n *\n * Dock state is not owned here: it lives in the store's dock registry, and\n * `computeDockLayout` turns that into a rect per panel. This hook derives its\n * panel's rect from the registry and pushes it into the caller's\n * position/size signals, so a panel joining or leaving a zone, a zone\n * thickness change, or a window resize relayouts everyone at once. Free\n * (undocked) drag and resize stay entirely local to the caller.\n */\nexport function createPanelDocking(options: CreatePanelDockingOptions) {\n const [undockedSize, setUndockedSize] = createSignal<PanelSize>({\n width: options.initialSize.width,\n height: options.initialSize.height,\n });\n const [dockPreview, setDockPreview] = createSignal<DockPreviewState>({\n visible: false,\n side: null,\n index: 0,\n });\n\n /** Reads straight from the registry, so a persisted dock restores on mount. */\n const dockedSide = createMemo(() => findDockedSide(debugStore.docks, options.panelId));\n const isDocked = () => dockedSide() !== null;\n\n const dockRect = createMemo<DockRect | null>(() => {\n if (!dockedSide()) return null;\n const layout = computeDockLayout(debugStore.docks, viewportSize(), {\n minSlotExtent: 0,\n });\n return layout[options.panelId] ?? null;\n });\n\n // Docked geometry is derived, so the panel follows the registry rather than\n // tracking its own position and size. The current values are read untracked\n // so writing them back cannot re-trigger this effect.\n createEffect(() => {\n const rect = dockRect();\n if (!rect) return;\n untrack(() => {\n const currentPos = options.position();\n const currentSize = options.size();\n if (currentPos.x !== rect.x || currentPos.y !== rect.y) {\n options.setPosition({ x: rect.x, y: rect.y });\n }\n if (currentSize.width !== rect.width || currentSize.height !== rect.height) {\n options.setSize({ width: rect.width, height: rect.height });\n }\n });\n });\n\n /** Docked panels are always explicitly sized; only floating ones hug content. */\n const [isAutoHeightSignal, setIsAutoHeight] = createSignal(true);\n const isAutoHeight = () => !isDocked() && isAutoHeightSignal();\n\n /** True while the panel is dragged as a small ghost; drives the ghost look. */\n const [isMoving, setIsMoving] = createSignal(false);\n // Whether the panel should go back to hugging its content once the ghost\n // is dropped; captured at drag start.\n let ghostRestoreAutoHeight = true;\n\n const showDockPreview = (side: DockSide, index: number) => {\n setDockPreview({ visible: true, side, index });\n };\n\n const hideDockPreview = () => {\n setDockPreview({ visible: false, side: null, index: 0 });\n };\n\n const rememberUndockedSize = (nextSize: PanelSize) => {\n setUndockedSize({ width: nextSize.width, height: nextSize.height });\n };\n\n const getLiveSize = () => {\n const panelElement = options.panelRef();\n if (panelElement) {\n const rect = panelElement.getBoundingClientRect();\n return { width: rect.width, height: rect.height };\n }\n return options.size();\n };\n\n const getDockPreviewRect = (): DockRect | null => {\n const preview = dockPreview();\n if (!preview.visible || !preview.side) return null;\n return previewDockRect(\n debugStore.docks,\n options.panelId,\n preview.side,\n preview.index,\n viewportSize(),\n );\n };\n\n const clampSizeToViewport = (width: number, height: number): PanelSize => {\n const viewport = viewportSize();\n const maxWidth = Math.max(1, viewport.width);\n const maxHeight = Math.max(1, viewport.height);\n const minWidth = Math.min(options.minSize.width, maxWidth);\n const minHeight = Math.min(options.minSize.height, maxHeight);\n return {\n width: Math.min(maxWidth, Math.max(minWidth, width)),\n height: Math.min(maxHeight, Math.max(minHeight, height)),\n };\n };\n\n const fitPanelToViewport = (\n currentX: number,\n currentY: number,\n currentWidth: number,\n currentHeight: number,\n ): FittedPanel => {\n const viewport = viewportSize();\n const fittedSize = clampSizeToViewport(currentWidth, currentHeight);\n const maxX = Math.max(0, viewport.width - fittedSize.width);\n const maxY = Math.max(0, viewport.height - fittedSize.height);\n return {\n position: {\n x: Math.max(0, Math.min(currentX, maxX)),\n y: Math.max(0, Math.min(currentY, maxY)),\n },\n size: fittedSize,\n };\n };\n\n /** The side whose edge the panel has been dragged past, if any. */\n const detectDockSide = (\n x: number,\n y: number,\n width: number,\n height: number,\n ): DockSide | null => {\n const viewport = viewportSize();\n const overflows: Array<{ side: DockSide; amount: number }> = [\n { side: 'left', amount: Math.max(0, -x) },\n { side: 'right', amount: Math.max(0, x + width - viewport.width) },\n { side: 'top', amount: Math.max(0, -y) },\n { side: 'bottom', amount: Math.max(0, y + height - viewport.height) },\n ];\n\n const best = overflows.reduce((a, b) => (b.amount > a.amount ? b : a));\n return best.amount >= SNAP_PREVIEW_THRESHOLD ? best.side : null;\n };\n\n /** Slot the panel would drop into on `side`, from the pointer position. */\n const detectDockIndex = (side: DockSide, pointerX: number, pointerY: number): number =>\n dockSlotIndex(\n debugStore.docks,\n side,\n { x: pointerX, y: pointerY },\n viewportSize(),\n options.panelId,\n );\n\n /**\n * Start moving the panel: shrink it to the fixed ghost footprint (keeping\n * the grab point under the pointer), undock it if needed, and remember\n * what to restore on drop. The small ghost is what makes free placement\n * possible — a full-size panel overflows viewport edges almost anywhere,\n * which is what used to trigger accidental docking.\n */\n const beginDragGhost = (pointerX: number, pointerY: number): FittedPanel => {\n const currentPos = options.position();\n const currentSize = getLiveSize();\n if (isDocked()) {\n // A docked panel restores the size it had before docking.\n ghostRestoreAutoHeight = true;\n } else {\n rememberUndockedSize(currentSize);\n ghostRestoreAutoHeight = isAutoHeightSignal();\n }\n\n const ghost = clampSizeToViewport(GHOST_SIZE.width, GHOST_SIZE.height);\n const pointerRatioX = currentSize.width > 0\n ? Math.max(0, Math.min(1, (pointerX - currentPos.x) / currentSize.width))\n : 0;\n const pointerRatioY = currentSize.height > 0\n ? Math.max(0, Math.min(1, (pointerY - currentPos.y) / currentSize.height))\n : 0;\n const fitted = fitPanelToViewport(\n pointerX - ghost.width * pointerRatioX,\n pointerY - ghost.height * pointerRatioY,\n ghost.width,\n ghost.height,\n );\n\n undockPanelFromSides(options.panelId);\n options.setSize(fitted.size);\n options.setPosition(fitted.position);\n setIsAutoHeight(false);\n setIsMoving(true);\n hideDockPreview();\n return fitted;\n };\n\n /**\n * Drop the ghost without docking: restore the remembered floating size at\n * the drop position and commit the result.\n */\n const endDragGhost = (): FittedPanel => {\n const preferred = undockedSize();\n const restored = clampSizeToViewport(preferred.width, preferred.height);\n const currentPos = options.position();\n const fitted = fitPanelToViewport(\n currentPos.x,\n currentPos.y,\n restored.width,\n restored.height,\n );\n\n options.setSize(fitted.size);\n options.setPosition(fitted.position);\n setIsAutoHeight(ghostRestoreAutoHeight);\n setIsMoving(false);\n options.onSizeCommit?.(fitted.size);\n options.onPositionCommit?.(fitted.position);\n return fitted;\n };\n\n /**\n * Start a resize. Dragging the edge a docked panel exposes to the viewport\n * resizes its zone; any other edge pulls the panel out of the dock first.\n */\n const beginResize = (direction: string | null): { size: PanelSize; mode: ResizeMode } => {\n hideDockPreview();\n const side = dockedSide();\n\n if (side && direction && direction === innerEdgeFor(side)) {\n const currentSize = getLiveSize();\n options.setSize(currentSize);\n setIsAutoHeight(false);\n return { size: currentSize, mode: 'thickness' };\n }\n\n if (side) {\n undockPanelFromSides(options.panelId);\n }\n const currentSize = getLiveSize();\n options.setSize(currentSize);\n setIsAutoHeight(false);\n return { size: currentSize, mode: 'free' };\n };\n\n /**\n * Apply a thickness resize from a pointer delta. The zone's cross-axis\n * extent and the panel's position both follow from the registry.\n */\n const resizeDockThickness = (startThickness: number, deltaX: number, deltaY: number) => {\n const side = dockedSide();\n if (!side) return;\n\n const horizontal = isHorizontalSide(side);\n const delta = horizontal ? deltaX : deltaY;\n // Left and top grow away from their edge; right and bottom grow toward it.\n const signed = side === 'left' || side === 'top' ? delta : -delta;\n const minThickness = horizontal ? options.minSize.width : options.minSize.height;\n const next = clampThickness(\n debugStore.docks,\n side,\n startThickness + signed,\n viewportSize(),\n minThickness,\n );\n setDockThickness(side, next);\n };\n\n const clearDockedSide = () => {\n undockPanelFromSides(options.panelId);\n };\n\n /** Commit a hovering dock preview. Returns the side taken, or null. */\n const applyDockPreview = (): { side: DockSide; index: number } | null => {\n const preview = dockPreview();\n if (!preview.visible || !preview.side) return null;\n\n if (!isDocked()) {\n rememberUndockedSize(options.size());\n }\n\n dockPanelToSide(options.panelId, preview.side, preview.index);\n setIsAutoHeight(false);\n setIsMoving(false);\n hideDockPreview();\n return { side: preview.side, index: preview.index };\n };\n\n const restoreUndockedPanel = (): FittedPanel => {\n const preferred = undockedSize();\n const restored = clampSizeToViewport(preferred.width, preferred.height);\n const currentPos = options.position();\n const fitted = fitPanelToViewport(\n currentPos.x,\n currentPos.y,\n restored.width,\n restored.height,\n );\n\n undockPanelFromSides(options.panelId);\n options.setSize(fitted.size);\n options.setPosition(fitted.position);\n setIsAutoHeight(true);\n options.onSizeCommit?.(fitted.size);\n options.onPositionCommit?.(fitted.position);\n return fitted;\n };\n\n /** Imperative dock command, for host APIs and toolbar buttons. */\n const dockTo = (side: DockSide | null) => {\n if (side === null) {\n if (isDocked()) restoreUndockedPanel();\n return;\n }\n if (!isDocked()) {\n rememberUndockedSize(options.size());\n }\n dockPanelToSide(options.panelId, side);\n setIsAutoHeight(false);\n };\n\n /**\n * Keep a floating panel inside a resized viewport. Docked panels need no\n * handling here; their rects are derived from the viewport signal.\n */\n const fitFloatingPanelToViewport = () => {\n if (isDocked()) return;\n\n const currentPos = options.position();\n const currentSize = isAutoHeight() ? getLiveSize() : options.size();\n const fitted = fitPanelToViewport(\n currentPos.x,\n currentPos.y,\n currentSize.width,\n currentSize.height,\n );\n\n if (\n currentSize.width !== fitted.size.width\n || currentSize.height !== fitted.size.height\n ) {\n options.setSize(fitted.size);\n options.onSizeCommit?.(fitted.size);\n }\n if (currentPos.x !== fitted.position.x || currentPos.y !== fitted.position.y) {\n options.setPosition(fitted.position);\n options.onPositionCommit?.(fitted.position);\n }\n };\n\n // One shared viewport signal replaces the per-panel resize listeners.\n createEffect(() => {\n viewportSize();\n untrack(fitFloatingPanelToViewport);\n });\n\n return {\n dockedSide,\n dockRect,\n isAutoHeight,\n setIsAutoHeight,\n showDockPreview,\n hideDockPreview,\n rememberUndockedSize,\n getLiveSize,\n getDockPreviewRect,\n detectDockSide,\n detectDockIndex,\n beginDragGhost,\n endDragGhost,\n isMoving,\n clampSizeToViewport,\n fitPanelToViewport,\n beginResize,\n resizeDockThickness,\n clearDockedSide,\n applyDockPreview,\n restoreUndockedPanel,\n dockTo,\n };\n}\n\n/**\n * Outline showing where a dragged panel would dock.\n *\n * Portaled so the panel's own bounds cannot clip it, and into the layer container\n * rather than `document.body` so it stays in the tree the editor's tokens and\n * styles were injected into.\n */\nexport const DockPreviewOverlay: Component<{\n rect: DockRect | null;\n /** Rank within the panel tier; keeps it just above the panel it belongs to. */\n rank: Accessor<number> | number;\n}> = (props) => {\n const layer = useLayer('panel', props.rank);\n\n return (\n <Show when={props.rect}>\n {(previewRect) => (\n <Show when={layer.mount()} keyed>\n {(mount) => (\n <Portal mount={mount}>\n <div\n style={{\n position: 'fixed',\n left: `${previewRect().x}px`,\n top: `${previewRect().y}px`,\n width: `${previewRect().width}px`,\n height: `${previewRect().height}px`,\n 'z-index': layer.zIndex(),\n 'pointer-events': 'none',\n 'box-sizing': 'border-box',\n border: '2px dashed var(--zylem-color-primary)',\n background: 'rgba(10, 20, 30, 0.2)',\n 'border-radius': '0',\n }}\n />\n </Portal>\n )}\n </Show>\n )}\n </Show>\n );\n};\n","/**\n * Shared viewport size signal.\n *\n * Dock rects are derived from the viewport, and every docked panel has to\n * relayout together on resize, so one throttled signal drives them all rather\n * than each panel installing its own listener and reading `window` directly.\n */\n\nimport { createSignal } from 'solid-js';\nimport type { Viewport } from './dock-layout';\n\nconst readViewport = (): Viewport =>\n\ttypeof window === 'undefined'\n\t\t? { width: 0, height: 0 }\n\t\t: { width: window.innerWidth, height: window.innerHeight };\n\nconst [viewportSize, setViewportSize] = createSignal<Viewport>(readViewport(), {\n\tequals: (a, b) => a.width === b.width && a.height === b.height,\n});\n\nif (typeof window !== 'undefined') {\n\tlet frame: number | undefined;\n\twindow.addEventListener('resize', () => {\n\t\tif (frame !== undefined) cancelAnimationFrame(frame);\n\t\tframe = requestAnimationFrame(() => {\n\t\t\tframe = undefined;\n\t\t\tsetViewportSize(readViewport());\n\t\t});\n\t});\n}\n\nexport { viewportSize };\n\n/** Untracked read, for imperative paths like pointer math. */\nexport const currentViewport = readViewport;\n","/**\n * DetachedPanel - A floating panel for sections that have been detached from the accordion.\n * \n * Features:\n * - Draggable title bar\n * - Resizable from edges and corners\n * - Z-index ordering (click to bring to front)\n * - Drag back over accordion to reattach at specific position\n * - Close button reattaches to accordion\n */\n\nimport { createSignal, onCleanup, onMount, type Component, type JSX } from 'solid-js';\nimport { useLayer, WindowControls } from '@zylem/ui/components';\nimport {\n reattachPanel,\n updateDetachedPanelPosition,\n updateDetachedPanelSize,\n debugStore,\n setDraggingPanel,\n setDropTargetIndex,\n clearDragState,\n bringPanelToFront,\n} from '../editor-store';\nimport { getPanelTitle, renderPanelContent } from './panel-config';\nimport { createPanelDocking, DockPreviewOverlay, type ResizeMode } from '../common/panel-docking';\nimport { isHorizontalSide } from '../common/dock-layout';\nimport { PANEL_RANK } from '../common/layer-ranks';\n\n// Minimum drag threshold to distinguish from clicks\nconst DRAG_THRESHOLD = 3;\nconst MIN_WIDTH = 250;\nconst MIN_HEIGHT = 150;\n\ntype ResizeDirection = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw' | null;\n\nexport interface DetachedPanelProps {\n panelId: string;\n}\n\nexport const DetachedPanel: Component<DetachedPanelProps> = (props) => {\n const panelState = () => debugStore.detachedPanels[props.panelId];\n // Position in `panelZOrder` becomes the rank, so clicking a panel raises it\n // above its siblings without leaving the panel tier.\n const rank = () =>\n PANEL_RANK.detachedBase + debugStore.panelZOrder.indexOf(props.panelId);\n const layer = useLayer('panel', rank);\n const initialPanelSize = panelState()?.size ?? { width: 350, height: 300 };\n\n const [position, setPosition] = createSignal(\n panelState()?.position ?? { x: 100, y: 100 }\n );\n const [size, setSize] = createSignal(\n initialPanelSize\n );\n\n let isDragging = false;\n let isResizing = false;\n let resizeMode: ResizeMode = 'free';\n let resizeDirection: ResizeDirection = null;\n let dragStartPos = { x: 0, y: 0 };\n let panelStartPos = { x: 0, y: 0 };\n let panelStartSize = { width: 0, height: 0 };\n let startThickness = 0;\n let hasMoved = false;\n let panelRef: HTMLDivElement | undefined;\n\n const {\n dockedSide,\n isAutoHeight,\n showDockPreview,\n hideDockPreview,\n rememberUndockedSize,\n getLiveSize,\n getDockPreviewRect,\n detectDockSide,\n detectDockIndex,\n beginDragGhost,\n endDragGhost,\n isMoving,\n clampSizeToViewport,\n beginResize,\n resizeDockThickness,\n applyDockPreview,\n } = createPanelDocking({\n panelId: props.panelId,\n initialSize: initialPanelSize,\n minSize: { width: MIN_WIDTH, height: MIN_HEIGHT },\n position,\n setPosition,\n size,\n setSize,\n panelRef: () => panelRef,\n onPositionCommit: (nextPosition) => updateDetachedPanelPosition(props.panelId, nextPosition),\n onSizeCommit: (nextSize) => updateDetachedPanelSize(props.panelId, nextSize),\n });\n\n const handlePanelPointerDown = () => {\n // Bring to front on any click/touch\n bringPanelToFront(props.panelId);\n };\n\n const handleTitleBarPointerDown = (e: PointerEvent) => {\n isDragging = true;\n hasMoved = false;\n hideDockPreview();\n dragStartPos = { x: e.clientX, y: e.clientY };\n panelStartPos = { ...position() };\n bringPanelToFront(props.panelId);\n \n // Prevent default on mouse to avoid selection, but allow touch actions if needed\n // though touch-action: none handles the scrolling prevention\n if (e.pointerType === 'mouse') {\n e.preventDefault();\n }\n };\n\n const handleResizePointerDown = (direction: ResizeDirection) => (e: PointerEvent) => {\n isResizing = true;\n resizeDirection = direction;\n const side = dockedSide();\n const { size: currentSize, mode } = beginResize(direction);\n resizeMode = mode;\n // A thickness resize measures from the zone's current extent, not the\n // panel box, since every panel in the zone shares it.\n startThickness = side && isHorizontalSide(side) ? currentSize.width : currentSize.height;\n dragStartPos = { x: e.clientX, y: e.clientY };\n panelStartPos = { ...position() };\n panelStartSize = { ...currentSize };\n bringPanelToFront(props.panelId);\n \n if (e.pointerType === 'mouse') {\n e.preventDefault();\n }\n e.stopPropagation();\n };\n\n const handlePointerMove = (e: PointerEvent) => {\n if (isDragging) {\n let deltaX = e.clientX - dragStartPos.x;\n let deltaY = e.clientY - dragStartPos.y;\n\n if (Math.abs(deltaX) > DRAG_THRESHOLD || Math.abs(deltaY) > DRAG_THRESHOLD) {\n if (!hasMoved) {\n hasMoved = true;\n setDraggingPanel(props.panelId);\n // Every move happens through the small ghost, docked or not.\n const fitted = beginDragGhost(e.clientX, e.clientY);\n dragStartPos = { x: e.clientX, y: e.clientY };\n panelStartPos = { ...fitted.position };\n panelStartSize = { ...fitted.size };\n deltaX = 0;\n deltaY = 0;\n }\n }\n\n if (hasMoved) {\n const proposedX = panelStartPos.x + deltaX;\n const proposedY = panelStartPos.y + deltaY;\n const currentSize = getLiveSize();\n const dockSide = detectDockSide(\n proposedX,\n proposedY,\n currentSize.width,\n currentSize.height,\n );\n\n if (dockSide) {\n showDockPreview(dockSide, detectDockIndex(dockSide, e.clientX, e.clientY));\n setDropTargetIndex(null);\n } else {\n hideDockPreview();\n }\n\n const newPos = {\n x: Math.max(0, Math.min(proposedX, window.innerWidth - 100)),\n y: Math.max(0, Math.min(proposedY, window.innerHeight - 50)),\n };\n setPosition(newPos);\n\n // Check if over the main editor panel and determine drop index\n if (!dockSide) {\n const editorPanel = document.querySelector('.zylem-accordion');\n if (editorPanel) {\n const panelRect = editorPanel.getBoundingClientRect();\n const isOverPanel =\n e.clientX >= panelRect.left &&\n e.clientX <= panelRect.right &&\n e.clientY >= panelRect.top &&\n e.clientY <= panelRect.bottom;\n\n if (isOverPanel) {\n const accordionItems = editorPanel.querySelectorAll('.accordion-item');\n let dropIndex = 0;\n\n for (let i = 0; i < accordionItems.length; i++) {\n const item = accordionItems[i];\n if (!item) continue;\n const itemRect = item.getBoundingClientRect();\n const itemMiddle = itemRect.top + itemRect.height / 2;\n if (e.clientY > itemMiddle) {\n dropIndex = i + 1;\n }\n }\n setDropTargetIndex(dropIndex);\n } else {\n setDropTargetIndex(null);\n }\n }\n }\n }\n } else if (isResizing && resizeDirection) {\n const deltaX = e.clientX - dragStartPos.x;\n const deltaY = e.clientY - dragStartPos.y;\n\n // While docked, the only free dimension is the zone's thickness;\n // position and cross-axis extent come from the dock layout.\n if (resizeMode === 'thickness') {\n resizeDockThickness(startThickness, deltaX, deltaY);\n return;\n }\n\n let newWidth = panelStartSize.width;\n let newHeight = panelStartSize.height;\n let newX = panelStartPos.x;\n let newY = panelStartPos.y;\n\n // Handle horizontal resizing\n if (resizeDirection.includes('e')) {\n newWidth = Math.max(MIN_WIDTH, panelStartSize.width + deltaX);\n } else if (resizeDirection.includes('w')) {\n const proposedWidth = panelStartSize.width - deltaX;\n if (proposedWidth >= MIN_WIDTH) {\n newWidth = proposedWidth;\n newX = panelStartPos.x + deltaX;\n }\n }\n\n // Handle vertical resizing\n if (resizeDirection.includes('s')) {\n newHeight = Math.max(MIN_HEIGHT, panelStartSize.height + deltaY);\n } else if (resizeDirection.includes('n')) {\n const proposedHeight = panelStartSize.height - deltaY;\n if (proposedHeight >= MIN_HEIGHT) {\n newHeight = proposedHeight;\n newY = panelStartPos.y + deltaY;\n }\n }\n\n const clampedSize = clampSizeToViewport(newWidth, newHeight);\n const maxX = Math.max(0, window.innerWidth - clampedSize.width);\n const maxY = Math.max(0, window.innerHeight - clampedSize.height);\n setSize(clampedSize);\n setPosition({\n x: Math.max(0, Math.min(newX, maxX)),\n y: Math.max(0, Math.min(newY, maxY)),\n });\n }\n };\n\n const handlePointerUp = () => {\n if (isDragging && hasMoved) {\n if (applyDockPreview()) {\n // Docking state and store updates are handled by the shared controller.\n } else {\n const dropIndex = debugStore.dropTargetIndex;\n if (dropIndex !== null) {\n // The panel unmounts when it reattaches to the accordion.\n reattachPanel(props.panelId, dropIndex);\n } else {\n // Drop the ghost: restores the pre-drag size and commits\n // position/size through the controller callbacks.\n endDragGhost();\n }\n }\n }\n\n // A thickness resize keeps the panel docked; its extent already lives in\n // the registry, so only a free resize reports a floating size.\n if (isResizing && resizeMode === 'free') {\n rememberUndockedSize(size());\n updateDetachedPanelSize(props.panelId, size());\n updateDetachedPanelPosition(props.panelId, position());\n }\n\n isDragging = false;\n isResizing = false;\n resizeMode = 'free';\n resizeDirection = null;\n hasMoved = false;\n hideDockPreview();\n clearDragState();\n };\n\n const handleClose = () => {\n reattachPanel(props.panelId);\n };\n\n onMount(() => {\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n });\n\n onCleanup(() => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n });\n\n const resizeHandleStyle = (cursor: string): JSX.CSSProperties => ({\n position: 'absolute',\n 'z-index': 10,\n cursor,\n 'touch-action': 'none',\n });\n\n return (\n <div\n class=\"detached-panel floating-panel\"\n ref={panelRef}\n onPointerDown={handlePanelPointerDown}\n style={{\n left: `${position().x}px`,\n top: `${position().y}px`,\n width: `${size().width}px`,\n height: isAutoHeight() ? 'auto' : `${size().height}px`,\n 'z-index': layer.zIndex(),\n 'border-radius': dockedSide() ? '0' : undefined,\n // The editor overlay root is pointer-events: none; re-enable\n // interaction for the panel itself.\n 'pointer-events': 'auto',\n // While being moved the panel is just a transparent outline.\n ...(isMoving()\n ? {\n background: 'transparent',\n 'backdrop-filter': 'none',\n '-webkit-backdrop-filter': 'none',\n 'box-shadow': 'none',\n border: '2px solid var(--zylem-color-primary, #61a6e8)',\n }\n : {}),\n }}\n >\n <DockPreviewOverlay\n rect={getDockPreviewRect()}\n rank={() => rank() + 1}\n />\n\n {/* Title bar */}\n <div\n class=\"detached-panel-titlebar floating-panel-titlebar\"\n onPointerDown={handleTitleBarPointerDown}\n style={{\n \"touch-action\": \"none\",\n 'border-radius': dockedSide() ? '0' : undefined,\n visibility: isMoving() ? 'hidden' : undefined,\n }}\n >\n <span class=\"floating-panel-title\">{getPanelTitle(props.panelId)}</span>\n <WindowControls onClose={handleClose} closeLabel=\"Dock back to panel\" />\n </div>\n\n {/* Content area */}\n <div\n class=\"detached-panel-content floating-panel-content\"\n style={{ visibility: isMoving() ? 'hidden' : undefined }}\n >\n {renderPanelContent(props.panelId)}\n </div>\n\n {/* Resize handles - edges */}\n <div\n style={{ ...resizeHandleStyle('ns-resize'), top: 0, left: '10px', right: '10px', height: '6px' }}\n onPointerDown={handleResizePointerDown('n')}\n />\n <div\n style={{ ...resizeHandleStyle('ns-resize'), bottom: 0, left: '10px', right: '10px', height: '6px' }}\n onPointerDown={handleResizePointerDown('s')}\n />\n <div\n style={{ ...resizeHandleStyle('ew-resize'), left: 0, top: '10px', bottom: '10px', width: '6px' }}\n onPointerDown={handleResizePointerDown('w')}\n />\n <div\n style={{ ...resizeHandleStyle('ew-resize'), right: 0, top: '10px', bottom: '10px', width: '6px' }}\n onPointerDown={handleResizePointerDown('e')}\n />\n\n {/* Resize handles - corners */}\n <div\n style={{ ...resizeHandleStyle('nwse-resize'), top: 0, left: 0, width: '10px', height: '10px' }}\n onPointerDown={handleResizePointerDown('nw')}\n />\n <div\n style={{ ...resizeHandleStyle('nesw-resize'), top: 0, right: 0, width: '10px', height: '10px' }}\n onPointerDown={handleResizePointerDown('ne')}\n />\n <div\n style={{ ...resizeHandleStyle('nesw-resize'), bottom: 0, left: 0, width: '10px', height: '10px' }}\n onPointerDown={handleResizePointerDown('sw')}\n />\n <div\n style={{ ...resizeHandleStyle('nwse-resize'), bottom: 0, right: 0, width: '10px', height: '10px' }}\n onPointerDown={handleResizePointerDown('se')}\n />\n </div>\n );\n};\n","import type { Component } from 'solid-js';\nimport {\n\tEditor,\n\ttype EditorController,\n\ttype EditorLauncherMode,\n} from './components/Editor';\nimport type { EditorDockDefaults } from './components/editor-store';\n\nexport interface AppProps {\n\tlauncherMode?: EditorLauncherMode | undefined;\n\tdefaultDocks?: EditorDockDefaults | undefined;\n\tonControllerReady?: ((controller: EditorController | null) => void) | undefined;\n}\n\nconst App: Component<AppProps> = (props) => {\n\treturn (\n\t\t<Editor\n\t\t\tlauncherMode={props.launcherMode}\n\t\t\tdefaultDocks={props.defaultDocks}\n\t\t\tonControllerReady={props.onControllerReady}\n\t\t/>\n\t);\n};\n\nexport default App;\nexport type { EditorController, EditorLauncherMode } from './components/Editor';\nexport type { EditorDockDefaults } from './components/editor-store';\n","export default \"@import \\\"https://fonts.googleapis.com/css2?family=Exo+2:ital,wght@0,100..900;1,100..900&display=swap\\\";\\n\\n/* src/fonts.css */\\n\\n/* vanilla-extract-css-ns:src/theme.css.ts.vanilla.css?source=#H4sIAAAAAAAAE42X3W7jKhDH789TjFRV20hgAcYYe6_abvY9iE1Sax0TgbNNe3Te_Qg7uImD26ofF_0PM78ZZoa0tMb0CMoX43r49x8AjN_fWr3HlWmNxQfb7JV9K-FO0Eexlj-XLPCL-attCXfpk3z89Ymdqvrmry7hjjyL9VPEUFWV7voS7taCZylfMpgCPhfpI3teNJviPUr2m0XcbVT1Z2fNsatLuKOUZjTi7MMI91Z1rj2OkHa3UQ-UIGAEQUoQkISL1e15d7RbVXkM-kh_s3zRYkqLMSZTGiExth4NfqWCp7G8x4QHNI_FsgyBGNjyCNpoH-LGTvFoQlWlnfvAVSJP-SbC0-vTeJvrp_XvuIydrkxXj40mZcGK9a1hZTpnWn11XxMtJwGWZRHacPbMctvL7qCqptvh08mVQBLKMqv3UYNBX5Td3stL6r72ar4kt7sS6FLctgS66PjkZbYoejWdq827xk1luhKYPJyi0pAOFUuq5y1m6tZ0Pd6qfdO-lfBjfTLAfiBwqnPYadtsb2y9uxIov3ZjVd0cXQmUXf89dD9Nsmthr3ptG9XiXaucwwfV6baEtum0snjn3emuf6CS1HqHxr5JJYJcIKCUDbPBV-hinjkCb0CSTK5WX0XCtbJ_vgjHBIKUIkiLIVp2FW3aHmI5mnHuDW-U_SoOyRCwlJ1HmCRZtgJyf1aLHAEV4mxBkpSvIJVBpRJBxhHIIXMpVkAJuY8DbY59b7qxCl8g0VwiYLSYkNKp1j7rgiOgfAiZsxXwCadAkHIE2SAVbKEylyBhH31eIZ8m4xcVkgHHU9A0R8AYCSX44KEUgWBTxxTiO0RhH39eoSKsXEbSYeeygMQ8Us4RiEHI5QoyclEhee4rkhTZd3hq1e2-LtGAMrbm2Cdi4vFXJgoE2SBIdsXj52mo4QDEF4C2jW7rb7WO91WEBOVUFJqNgyTYuWviccbhfNGq1nacoG_dgx_Vc2vQqTUE9RfvecSo-NYQ95dTnCPgfHiEZp2ht1td9XjTHu2wU2cL91L2b8R8G17qfumyuO5eVG1ew-4jwNjhBBk_nEZE39Djd8J9Vk3ndA8E6OEE5PLap18koSSWxznQ2FblkqPwQ5L0Mhy-MCNo-Eq434YEPG_-gTtqafYJwuD0moDNHQyjFIt-DUlkLM6u9RUNn4KJjyFDgPkuZcsewhLwDhgJDmafs5hYPB-Gdnb-ehQZj53fmurosG263XicfFTo5jGQwzV8miNb3b7T-LXpavO69IyHjpw_5mc1tFEeVSvT9da0JYi4rKwfGDL7NGD6xnR4q1zvw5K9i6idsXvlsURc18ppbI59CdVx01R4o98bbR8ShhKJEoboVSVa9ab9_wnO3_KtEEpASETcm9qDsKh4MIfxTUujcm9M2zeHEnjcte6OJWSD9t__WRqzd-0NAAA */\\n:root,\\n:host {\\n --zylem-color-primary: #61A6E8;\\n --zylem-color-primary-hover: #3B8AD8;\\n --zylem-color-primary-active: #0C6EB8;\\n --zylem-color-accent: #E64534;\\n --zylem-color-accent-hover: #C93A2C;\\n --zylem-color-accent-active: #A82F24;\\n --zylem-color-background: #11151C;\\n --zylem-color-background-translucent: rgba(10, 20, 30, 0.46);\\n --zylem-color-surface: #1A1F27;\\n --zylem-color-surface-hover: #222831;\\n --zylem-color-border: #2D3643;\\n --zylem-color-active: rgba(20, 255, 60, 0.7);\\n --zylem-color-active-hover: rgba(20, 255, 60, 0.4);\\n --zylem-color-success-hover: #2a6734b3;\\n --zylem-color-text: #E6EBEF;\\n --zylem-color-text-secondary: #88929E;\\n --zylem-color-console-background: rgba(20, 40, 60, 0.25);\\n --zylem-color-console-text: #61A6E8;\\n --zylem-spacing-xxs: 0.125rem;\\n --zylem-spacing-xs: 0.25rem;\\n --zylem-spacing-sm: 0.5rem;\\n --zylem-spacing-md: 0.75rem;\\n --zylem-spacing-lg: 1rem;\\n --zylem-spacing-xl: 1.5rem;\\n --zylem-spacing-xxl: 2rem;\\n --zylem-spacing-xxxl: 3rem;\\n --zylem-size-icon: 28px;\\n --zylem-size-icon-sm: 16px;\\n --zylem-size-icon-lg: 96px;\\n --zylem-font-family: \\\"Exo 2\\\", sans-serif;\\n --zylem-font-size: 14px;\\n --zylem-radius: 12px;\\n --zylem-border: 1.5px;\\n --zylem-material-glass-panel:\\n linear-gradient(\\n 180deg,\\n rgba(38, 76, 112, 0.74),\\n rgba(10, 24, 38, 0.58));\\n --zylem-material-glass-panel-dark:\\n linear-gradient(\\n 180deg,\\n rgba(26, 31, 39, 0.75),\\n rgba(10, 20, 30, 0.68));\\n --zylem-material-glossy-bar:\\n linear-gradient(\\n 180deg,\\n rgba(205, 232, 255, 0.55) 0%,\\n rgba(97, 166, 232, 0.34) 38%,\\n rgba(18, 54, 88, 0.86) 100%);\\n --zylem-material-button-glass:\\n linear-gradient(\\n 180deg,\\n rgba(178, 219, 255, 0.34),\\n rgba(30, 94, 148, 0.72) 48%,\\n rgba(9, 34, 58, 0.92));\\n --zylem-material-button-glass-hover:\\n linear-gradient(\\n 180deg,\\n rgba(218, 242, 255, 0.58),\\n rgba(48, 137, 220, 0.86) 48%,\\n rgba(11, 62, 112, 0.96));\\n --zylem-material-button-glass-active:\\n linear-gradient(\\n 180deg,\\n rgba(190, 255, 203, 0.42),\\n rgba(28, 174, 63, 0.78) 50%,\\n rgba(9, 86, 31, 0.95));\\n --zylem-material-button-glass-danger:\\n linear-gradient(\\n 180deg,\\n rgba(255, 210, 202, 0.36),\\n rgba(230, 69, 52, 0.82) 50%,\\n rgba(96, 18, 13, 0.94));\\n --zylem-material-field-glass:\\n linear-gradient(\\n 180deg,\\n rgba(8, 19, 31, 0.82),\\n rgba(15, 39, 62, 0.72));\\n --zylem-material-panel-header-gloss:\\n linear-gradient(\\n 180deg,\\n rgba(190, 226, 255, 0.18),\\n rgba(61, 118, 165, 0.16) 46%,\\n rgba(10, 27, 44, 0.26));\\n --zylem-effect-blur-sm: 8px;\\n --zylem-effect-blur-md: 14px;\\n --zylem-effect-blur-lg: 24px;\\n --zylem-effect-shadow-panel: 0 22px 54px rgba(0, 0, 0, 0.48), inset 0 1px 0 rgba(255, 255, 255, 0.10);\\n --zylem-effect-shadow-button:\\n inset 0 1px 0 rgba(255,255,255,0.38),\\n inset 0 -1px 0 rgba(0,0,0,0.45),\\n 0 2px 7px rgba(0,0,0,0.35);\\n --zylem-effect-shadow-inset: inset 0 1px 2px rgba(0,0,0,0.42), inset 0 -1px 0 rgba(255,255,255,0.08);\\n --zylem-effect-glow-primary: 0 0 18px rgba(97, 166, 232, 0.28);\\n --zylem-effect-glow-active: 0 0 20px rgba(20, 255, 60, 0.26);\\n --zylem-effect-glow-danger: 0 0 20px rgba(230, 69, 52, 0.24);\\n --zylem-effect-focus-ring: 0 0 0 2px rgba(97, 166, 232, 0.38), 0 0 18px rgba(97, 166, 232, 0.22);\\n --zylem-radius-window: 14px;\\n --zylem-radius-panel: 12px;\\n --zylem-radius-button: 7px;\\n --zylem-radius-control: 6px;\\n --zylem-radius-card: 10px;\\n --zylem-motion-fast: 120ms;\\n --zylem-motion-normal: 160ms;\\n --zylem-motion-ease-out: cubic-bezier(.2,.8,.2,1);\\n --zylem-layer-base: 0;\\n --zylem-layer-panel: 1000;\\n --zylem-layer-modal: 2000;\\n --zylem-layer-popover: 3000;\\n --zylem-layer-tooltip: 4000;\\n --zylem-layer-menu: 5000;\\n}\\n\\n/* vanilla-extract-css-ns:src/layers/layer-tokens.css.ts.vanilla.css?source=Lnp5bGVtLWxheWVyLXBvcnRhbHMgewogIHBvaW50ZXItZXZlbnRzOiBhdXRvOwp9Ci56eWxlbS1sYXllci1zY29wZSB7CiAgaXNvbGF0aW9uOiBpc29sYXRlOwp9 */\\n.zylem-layer-portals {\\n pointer-events: auto;\\n}\\n.zylem-layer-scope {\\n isolation: isolate;\\n}\\n\\n/* vanilla-extract-css-ns:src/global/logo.css.ts.vanilla.css?source=#H4sIAAAAAAAAE-y6Rw-13HI1OO9f4Vm3RFvk5B6Rc87MyDkdMt-fbz2vr-1r69pq9fhDgsOGqrVXrdpVRwj-5bcsxz_9r__jn_7pn__5e8dq-udxaZZ_Pn_jv_zT-Rv_r_-zzI7sX7opaypwnZv_J8_2isD-7y5kLfeGNKlZGIZhTC9ohaBhGMb5MxQYjkkYhmGLYmunP1dYqWT9QGAYXbI58GnZP3Yc23uiajIMS6gNwzSKwzD2HzyOIRiGKX2GYaz1DyrxB0REueIcBeoP3j2FiRelpu8wG_OXByMzrsIw97_O_xcPd2HYv_FhGLZj3P3vxxvjNf9h_2cW_2-_rPLn8DK-8rfxX2SFFhkYlvk3fy5h_m0Tmr9C_HPw_rogOlncjrkEt6VEvwpvnJaHPYbDvAavwFbPQFavIAov_O3cgBiG4Zc_uH_Hf2GUv5tPYBbG-E_jvzZ9lqzsLye1ENq0uBmGewyGYXafcbhsZv9KypqFblKKrenza58j0JlE7pVMwVlJ8P23KKiKX7E8Zo80dltFbo9cwj9rbmhlEoccUUdrwj9rgsdSEi6lYzFrbo9Cdn-2pyZ-yDQOQr-pxyB6z5wGpwBcxzQK_7yplBDB4Er_gakOaQ91mexCBb9cOlqi5YujxotfxVRchj_glkfdRke9Rgf_8T8KdDxLScT0CP-U92_Y3H_gu1L4Jai6FrK75gjWFJM7WZPY5WgI2Z7S_bv9v-3_xmUKsSxKaGVqoVJmCP2lz-LF21Siu9TD_2h1pXG7ph316D1zKc3yn3E4Fsuj5yy-P9ox_yNOJYm3_gmnwVH_PZ_ZXdPpf-ZTSuP0_4HPkHx_rzELF9N95qg664jb60i4pxE85rP7_cXJozr7P2NRf8Xdr3yOPFcxmncSmaPdC5SO_KUZ4SD0nqOqX0hin_qY9vc8bOlfbQJpxNLoSVxpPNII_7KIPu1euI3e-Xecf2jzj7n8a12Jo5D9xd38k2vA8JnX5O_rf7L5T3rzz59cEX5ED1mU4q4kQqmP_VWbus9Auq8g4d_Vps3R_8j-P8crt0fBr3wxhX_VfCjRV87j_7gP-Pf1p-6swXzTSIRyVA1yhN7_a8x_5blfvTQ2r1wOoT-6hBG-ljz22hwNZVE6WaM6Fgi9l_GfdY-H-TRC_w0OnyPwXUzhVyDjlffY_e8Yg3nlMfumsfkPtf-bv11M45_10pbSX_7Pf_jTbxaFf-oT-h_8k2AKvxx54L_5o0Z_X__Nvf-i7V81QUTh38eKAeanUDr6j-_9l3wPybd-ZaRuaWT-V33-4vhXvxjUNn2p_-J7X6lkEAUadtkU9iX_H9xsjv5Hvedvfe--_sIcVcHtMe3PGvqrX0p_9U-A28mSrZW_2rgXuGwoNywpQ3Ij4uFY03iMI9WbeQ7XCB3nDLTCKCcrCo4Y-OUiKfGTKGYZ1vHz609iw48QrentbZEgmUx10UTBcQKO4xxIPsx0VY2ZAEAQAFELLGkDFvaT03zKIg0awUiafr7vu2bU1s-TovbSG-SgIQZZaPBBVho84LUmdXjNKT1-cwqPn5yi40fH2NiRMVYWVqyVfRQrZV_FCpl3kQLm_d8Y_xvj_w9GVTEMLvgQV2ZpZFt33b3ycuxX-Fvo4Id__lWEwIeOQPoLGxe5czuiYcMErp9DYwWuoYUgXheRi2krgls5OpaphL2LoE1_UKdmn9mRjgJUH1YMIyghAcvBy3dNNpf2ESeJgQfJR-b1zoBcU5Jf7dHapE10AJUNqUWO0NPhIu6Um12Zf8ij9QAAM7QOHnsIgfYlBD1catR85UibGWb0PPksXTpO7tqUN2Ucr7rM2eIyLQUMJdsRd0M0XQH3TPlrBttxI-EGGZ-BRzI74TRuycB1kC5KldcVC1KCRQbkcbudSywoewHFlAbSY17QWHdd3vNO8FBdZz92VwPrN5X9hQsA9tIiAShcC8lRn5HcYCNXZu7pMCAShWg7Fe7mun8rY0RWs404RvGt3rLMwxTWPKSt3rZ9-At_ooSe_ON27ml-CayRKYGFv8vEzg0Ou7GEPh2DOPQHg-npJT-NJKEhxW-CViErAR1UluE9gIas8m9sYDfmwaxf_VlFkXvE8YJ5SpwtLYo-kVYgBpX6T23xcPVNez9eIDC_tv64XDjJyMm0WIOzWKPZxR_8nV-C2F3q54YFBejwQ0SQRsjYrqFi6X65E28ZRkFecYrvniKrfW_PSIK7WclaGUq7Onx_9BdMzwxWVQFdP5gA6wkaRSVrm16-h0Koe-HNDGlskJlpTIf38TE1FMfRTvb3kT-yUpBDJTbd_0YyQw8dufTWqUWhHb9hQeg0_QRuxOBN5BqwF8yKLy6rwpYSiJef0bf4TSvaqdEcs3TFavdqY7kDF3P6YpFmynSC2Hio9ay5GTFZz53cPlK54bU2ChtXGMNbX0wkCSkWeFs9s953soddjZWl7kAMtaWnJAuNecseoRXDbb89sAwGgJYr8eiKT12zsZG6eJ8LNaoYXW4G9TRYRqHVkrI-y--MBwnTWPu9rUkCjAqVPJ9NAxE3y0Yll3RscdGwlmgOI3DjjmrN99VAyml7szINw3_iaIzCJCFWBhW8snwYAIwcHdpjW28fSKAlTX9oPDAJ3jcr0UO36RSanVXezE4MgTL3gh1OVQPk7_r5_idP5KwuP1wk_Bygi1YV6OpavDDB--rdLp6i2fNz4aw9l1sj4blbRH7k30lgRvzmWqZ4WkVj3Cb3iwqlTCbVV2YSQ79vV07vJEZcF1FpDLYRK3Wt9L0JkqYVf6ORXB_sajN5zQRRAgc0TRKmT5uUbEg0Y10lMlnDVZKOoRkMmWvQScBwVbWdUckAxhaoiSS767EPfdi5CCLg3FteKAbY7OqZL5BrjTiB9G5vsQWaCoxRQJLDR7f0SWt2aoqw0nmUYEJfbLKN_fp7sVSNhLSO5hXBs7zXYDE27BbL2R0fiO5T49PMLIzCSr0Y3jPBgMzrVxcIiQNHHf3CUxaDvLknU7d5WIHvFqtwvHFvUUFdm238cE5xcyaGowLL-MRWrUTxS3e3IrLInfzxi3UldRcAA36ZhWIDzZbZUc4usMzYEMoM8io7jhMKDwEJ1bbVDt0lpTEOw2ty4dI33gI87YNxtcNwJYZJzDa_3P1jHlFYcrrhpKYJhQlvqJsLW-Gz4s6SrgcxE9IAYu2i0e8LLdDtXuTsy3kjJcCwIrU9dP-lgZB5cb2mi20GvdDNDguI1BN1x8uR6OXYS7K-dMKZr597L1963kGCYPacyF2B9ReF_spFS1hHEdYS-oiO7IxG20tG_PC4Btpeva1MCevYX1yO4872-7gWEEAXtITyjmTjNGqAZ8ZF3z5JKGzO7ikmFjC6Jo0EVZI4bjIDFiPuHkxblxXo4QP3zq53oWzwsMuUBNFg0tCAJJKDYvSntHUUD_iA8lcS_l0Dabz0tbaEfmGHbFi5Re8ADSDzOMgRiRpjfCcsjxMJRtt2WYhBtZQBIZKXeDlm-HCvJC03w83jgBEhPNkbUU39oLO4F9-huHG3Vr8BRoWJ__MnYwikhpq04sXwe79aEFeSk6rnFlP4eVdlAfebu4GS2WSXR5w5cEj8AjF6FCfDacYO64quDaxftjzsighfTxS3-iILheGGfAOZu4zmWDXrA0pZ4hfH4AZw6C8_kayIp_bXVrgdakMUC0T8DUXaq8cTfR30wbwvZYksZw5wNpufbMHDE2zg1NDPBmaXq3xt29VKNFa9YlDS-YRuvZbPrxllB4vJ3bpBusnBEF5vXTCF5l_m2S2T2X_tjAgp2_jbtfULc0vT_XDMMKj60QuvZTaEfWmIRWcAjh_7oCVinaOrskkJVVd4wKUeTbYvw10Uary8ix7kbGc86itfRZK5_bNnhTtth60dDUleZKpr2RZ5yI-7Fkz9KasrheuHVTMRYwY0JuNfocWz597DwDN4bSuIAk-Rx3UC98aD0Et8hnFgPRl-Rq4pDbWZw-5fjLeg9-ckHjNq6PD6gccAdpAI0bhYUpOmAtjCpi66T0pwtfIg7m7m9Y-9AfMXg1fO5TcwB7de9jmYp9lKgSW01aUaPDz6JU5dzydAUlycHkd2HbKLHLOW66XTfqhAy6fJDwSHhlK61V3KX1Eu_D5G4aWvjzkp90IVWpsp6oZ5XCBg50YZF-ScDte829ofQ2wQyzmRqBCP1j4Suz7CGngZbRdSihkZ8yxmK7X6YhP7KF-_m7CuebkFQyN9mWHHJW3hfLxsGMtQ9IAjOZ71mUbPC1LdRg8xQvhBnZZDlN9-jb2Dge1iBcSbF0qS5GjXIK3TGU6RtL8JI0pvS2K0V-FJPFjP2BNvWHvXtLzkbwAKuISztp05bWJugQywraW75ggfsEAZD-J8mUBJMjW4rEPYK9NpN8_OzboLzMRQuCWuTKsxRRvzmePdt6eoftvhTlbq46-dm0jwe6Go9bd1YyEHsUQIUo_jK59xySE5f2uywUcHVTkw4bVZgqDR5nUKCZWZ7VReOFf2g4C-vW8LxDCMx97k9jbwTUjUCkE6OCowA0j7Q-Z-lM1g6c2oEdJrdTSvAcYChf28YKyz0LwWIPpEYMrjfs2Cfe4HJYsrO2nrIF4ugTvgt3XpbFS8ZqyE8vgtUGrpI3HD44y91hy1ttLeVj_qCbiNsDuxc8fpgy064fSvJyH5QUrzQT-sOWy8vQLpUBGD0rJpNB-BZPDWoiQ84TwFuxBUdtm23_M4bDgzBFFGjfIM178oc4F2-BNE_Af_QMIoRlgm1tTOCnszbuAy8w6ihUwRuSLzz7eCXgNZhZTKyy0idOokSfqnoq8B1MAyXRGpxs-jdRIo-lu60OZTJZENZi8oGPdEHZmSAp8sFLLJ8NpMeEbUWWsrAOOPzrdwQ6OEeTFISVAg9Y9ub71WKkxtqbhGEkN-CEyVT3GT_TmRRwaQyzCC82vttzmUaLxDJm21fI4xklMZhzN4RYtVhwQATnHFtqNt0wj4IeWS0vuVjgV8EwvfuMFJigSkPghAukhX5t5E7mtUiNDAmyF2iW5PrilndAHo7al9e74kEAxewCUTP1yCrbNgugPRrMJENSmjDQdWx3kl0d484GSPeh0cFvKUYiNPnedS3uPWGHhaoEveVfBXkc9NKTDG-CfT7SE3GyFptj8LhDF_400INr-h7SUV8xbiu-THGBIW6u91ch1YK1wPGqhV5g7JbAPvcQR-aW-yQrdNw4OaQp-OegvRkxPhYWD-BlQlOYabhOrkJeY5_OZIm2xmX5ye094ImiGByWzRtNQbu5kbGoO-TcNNHWuFlxCAqLmHxQGAPsuZVxHTxYLZ3n_nHffh9nuPiC4AWtPo6lPdOhKoaJp-R57sn5n9dpIRmfSFbZEdN3xaGlkMR22MkJChqmwOi4DaDP3ti_TBLRZLEfU7Mo6eXwwmERRHwCe_j8aVcsvu4Oz4nlXmoo4QFm4gG-EaMqdc3tbOW8HHcZI8CfAykHh-RA8p5Qp-juIra3lYQcB14sXloMzkDBdARea3UH600sSEwer2ir7nbyAbSEQndvDrWGhrLIa0hNaOmH3SaqwnRD9h5q-3obrRDBFnW_Zv6hTm0fhoFp-lCThKlZQchEZjNeYo5bSOYpkBixNJnRhOxZoqeb2CrbqlkTBG52JnIJtd5h1uZtnbNY3N1PkGOu1pUvOyrK1-PGAMKPb64-GNChAb08qQS5wY2296QT3UwtuqhfsZ9vXsUNNjvVOcvzRKcagFYVPST8lQEyjUKA5phirBaTpjy2UCin4QwB0GlejxNlc81Q7vUY8BFeTTiRMKmQ-Sik8t_-yszDbTHFUmguO3jjxoCmFXk5oNyH8oOJtQBG7ZuBDIF2_w7T5AIH8QIAcJU81QvLL1W0X7Km5qYW-ly7jBOkABALNPx_WSgL1aUU2nUKRlwaVB7yQJZ3nfpSifQMiNGmBqxiihVimgdTc8zA871ihrsupvCyMlLjLP_Umq7ZNTxDdnTNO6FsBz6GNnW4N5p1uJxDChE_fDzn2vocCm1p9bizG4Pt0ho_1ezbjB29eueBn0YjPxOajJdE0F8sJj-tnTDdbDyyPlJN5fNqB4bbyJrfSWM8itQiM6R7kBXjcFIRBL7OYiS3EXUmoKaASgeSRl3FptVQl_DKQIwPjm0gsHXi2dU3gd8NHrAEaQP_J8dbnnqE0RPJmNIToTWKUb2YtGMVEFA9ClsEH_jB10YRReA0SKWzpCSjk3sjFUQm0FZmawnwk16e888ujeJCwnJ0B7o2h5Xc2B2DQVMwrdLa7uZqmX7fzpofZiDY4E1C7XwlQ2FBWJmA_-pC3tfBtpdA3xYv3xFad7g8UnlpEoJP8deVtc5MJ-vJxdNCafOOjtmkG62TqlNoEDeUoaGE8WEsdj3di3V7FAhg5sG0HjHZ11YXPaYOt96wg-SQTDt6tkJY20tyh_F0YknmJco6KDlt1uVTNJ_AxnRnFxdGVy3jjVKkMU1I5vRMbgyZB0vr5r44frDjGMw73C3iAji5SM35JU_IikboqobJQzIYNx3ZimkQObVIGWAzAPilv_AhRwyDVDsMomRTJEyv1ZwxDFFcUKHGqw009szpG0LXpMkoZTY5qIqKv1m3243IHs1k_ziq73WeE-9aBsVwPtf844LM3Mehs3O0xnBGCPsEwL3IoStFqPzGKiqGnYRt4QBI8GG_mt-QfXq-k8-xG3YElzOb4kCYAUNpKdZqNxJzPaLYyxuOzVCPLNcmzW3PIe565-djNMfUZWIwgo8RINuzWRsTRGtOv3hixnA21n6NwA74eg3MrNtgYOJfC-tE3tUDe3mElSqKVXon1F9ybPKJnhU0kuwXFL7TCy9-IR7Uccz8c6lyQxG5MMfrdyRmBQUe-UOkBk7LKE-_O7JehaO8Q5mrjuDfyycFuaLGQtsR0B7lN_zVmCeptdU7HN9noTWElG7gdZwa1I1O-yR2eiuB6vrxOXPs7cqFgP9W66GrcQ0JnEKGHo9YXh6mpyM7vlNBybWgkrRiMPUcUHc3jAOcFtyr7Hd9zOcQ4BmLVCVrXvM5flrg7bjJtOBzyBuwwx95nCDtg2Ce0ZWRAiZcstIJ0d9dfKTE3LTg8FQBSHseK5Y6OyfasrkTnpRHGJwxViplS4_MKo7h5nRE7Ocy9J9UXmnoYBGjhAWHlw1Bj3z1P2uww96hY-m7uuy7Ay9vlOyCauHxo69CsNw-gTJGaRhwI45Pt-4FdRN1BhcHvH6nsFrLiek4gG_Qa2i9Vq1juSKLjClPYuVIh7g16vPzIFFKq6cIS0p7mxdXsGLt3a2IjLQn3OCL9wS6YcCvXHmqrMkZMgLJufMbTHHz1jsyAj8m7EsGrcEJI7y_LvubtlJZnZkEEGKMSRkeiWNbry0BmijH6TZpWq0jFLnzBtpmx9pABdy3Ir1beyf_wEj-umtJH5IUtt-0cW85e8Eu7WaKiGynMTTGOrEK5wbOSL9subGZePt4NTH3Q5GULADhs-zl4kNdsXbmD2VkgL2h0nxvFQw0DL2w1pCxKNx3TsSEqXoKFWKJFqWk8Zyc3ctF2uTt78yJaPbVkWwgq2S5y8qyvDARI6h3T9MT8YSt-a2qVqpn9sElNye0Fn8LBj0V-KlJ3hog-TUSxUf0ZjEcjWYok-BzE3myQ6s4zYTpSRDkFFFyTLK8CirCCY1iq0rvJeYBJm9zZj6-C6sjYzCgruCmlF83LGtFs2y7RBGHyTmjgtmzWKKhSEx1ehtHkYHanZzVLM5OoAlograJjBrSbbipCg_XttOFMsUtMFqgXxhRZkwBEMgI9-IoAzTmpoLW4iBgTdGwesM48Dnp0EeFNRvih0OiDICm5dCWRLgYFssm8RPo1DoIrHT3PueqK4mNAwg2lnfzTcS6z67AsPD9ALKDqbIupX78KWPA4lm3fris5mMY0jasAhJiAoBCLXiyHACP0uqbWy3_2nBbCWfI0ybonqGuNuOZQS25v8aGwuK_j3OY-ruIyxE_PtafKVxHHedwS-L45-GrnhjbnND2oj8n0CJ1ws-Rin8OTK8pJOL45zLObdOCwB9JJpZa_ctxjL4F_nMa0brjfDtXALRO0lYB_DHZ2V0-FHH2gLZlrkK7NfAKIWWRrWHIFBF7NncdkltdHzZbqZBA5GYqLWtTy3SHkjPmWI7mfj9o01xa0o9YmXWpuJqul2lTeygccKZmdEZ2LidgabE0M8JXkMMwy1rjsXOF0exOqHz8SM8EPfUaVQ24kUVAz4kGE2YBuGKIXLWA4zle7EdUvRFg9duUqjDrvKeM7dKK7l11MxofvqiGoDlCD1hDkbqL69B1LZLdWPYKVd69yyVPgeVXFNbvzyhoYVWjnmngtsMAoIfIdFU0pfbnVeJkb0cSXsft3RDcSFZxBdalRMbJgKzxrBuSdzZY3Lr_Knunke7NGv9M8Dmuy4t-BLzqdjY0e-8XqJiXzKY1ZAKJ2nmRBlF7GkXgmL9R8wZJpECJ6XmehUitYT6t6KwPRsTOPCQmhXYZGRKxxIl7HAfTczuKp9XizElkF8CjQg3REI_omrn96JpUDnBmF48142vbqgfYJ97sMffaZ5nbLmagxcoDLLNgpVhxIic2Z7J8tJj1IA7zyO1ySRwyuKZN9Qu2aQ4UbWmWjMDxa5AiXPu0uS0QhIJpTg5oA_Lmc1zkVFcWcdtmJRrMqwCY89yWQLyDYzop46GVTScEZ3XGGSJE39yRuA4vdE-Yf1XXdugnSMt4D4LW5y9wINY7NojzQoizp38mYY2LD0XGMxaU0vGvYw5gjAIUTuwgSsOjUbekAOJ2mltVxNQ3UxP9rcEAf_pebZV7_cJC4mRxxy31Ui7UDl646xyD4iv8E9QeTO3RJDk2dSqklJwTXuGKBnwqOPOs6J1aTkjRCXXETsyrcB2fb4_I2FbSO1SpFjGMW7KMt-FudQC2HEngW9g_gdjO-OT0CHbdenc-zx96M4Zd6vYhZNf8l9zofQXoi74-ehBSEYB7ZnnsIiAgcou001SVKyRcxFzNlz1kxTxcrx3Ix5jt2p2R4Uzkf4uL2wDsvOyN36emHdcUc0RgjEY8caYJ8C6swZFrB384oIoGKy4N396TfjHZ3itbaSHJ5f6X4ky5qAoLhQMTsNWijBzBAvfz_ftAtk9NWa1SPdfR-g4JI_p6wsCHM3wA046yvCWZAIm8In-6lRekVTCnAvfqFO5Pj5Ao94Gx2gODUxeEp3SEPbYbZmaLVhxwigC2Ewsp_m0lR_57hfe09Z8dgGeuuSu_BL3UlhJbvI2-1GLSSaNi-VPvmL9LSYRJOT5Pm3D4t4NqrYwe5Pcr4yl1WAwIj6BBHQVHKeHTQ31b0BimfYm8md_hZ5REOUxES6gko5OrPVmQHm1h6E7deHvvI-k-cYi3BnET8bznc5GGeLhNkPAr15AnFaZ1x_MuIs0JbFplX52EtY2cRJ4NSiC91LyFz5pR4GkR1LGEPh1d57IhVMtl4na7kJgZxwaBsCZ7lQTOxDHXi40d6upYLx3tSKg6sbqES1Szg3MxxUaTirZdCQsGs1FedEHdmEjYNSYnVNc4vZFrAqSEISIQZWxigc4ehkdDcIvKe7ncSK35gKRcNqSSViqJOwBPFDZ_YfqHRwnZOWbNkOseGoLpugjotohBw7lqZrZJ7KihR1L01dVX681ylCjy7pLJsdVwqNLp9Y8asW1SidpGIWeEdqLTt9AKeQvWCDT-4Djc1NqYovTGFx7biGq64rjLTa4gA76sfXFls9ZGmPdaCkTEHMthxTmTbZJ1rkhv0T5PdV6EXzweAYRhmolWD8fEt1Oe9hDAQQrdFDh8DhmxMY0AbJQQ8yTZ8XZ1ll7i6U-fYxQroSHUBR-c74ZiFKNak5R-qEuUFgGVZzcm-1qF0AeojVvvWBUymOIupTSm2O_VVHa4UZ11aU8_72V1Wwxv7nSDUNKgz9a5vIASba62yXG8HaUfOiZJ3xNJKlNcsqLsdkP38IgFf0SX5fe2JsR8m_cj3klN0J8Hezp7yp1uDlJiR2nZPZqD31HHwUEHEeuQssOgKXVbocISY6pGhLNzYIAg7dU8VXnJwWzessnCMGJRx_BpkV61hUkU5B_QCetqBc-6SY9w9sNILBnfmDVWz-2fmxRCqANascUnRO0QNuwMV-Ech4ZVDOHVpTzmY1NR9oZGVw6gj9JFsCwpY_CGg7yB9lBBkpC_KjSI09Tkd0H-Q3tV5_h3WkymhCLpj8wgwDiJ84LSznK0-s2KSnm4VErTrnKd7eM6vQOhj349u9lTjOaUKshdk0_LCMTdpNYpVbL4QYV6v7OvhZjLRfrUs_yQK0IKDStBQ7ghdMJpR7bBJEKQ1ahsmJHlmYiFkphUWspjMYVZKxDxaYKtm4pUTMrId93bgrCfyoOAcJVD39EKtYcKAIQSEvAeEwnrIc2rhtnQzwM0dRoFmRksevU0lKj4FNLv_o7dLRIFVsJTGoFbE8m_EdDvLh6DeOqcSONBaj6DeUfcJER_oNtL0ussXOp703ZIrq9NXeL_VWZNuRYMzbFNnBgjApy0rmAA3PP4xCAfjGnG-VGccLBoA9o_tAeY1NUAVEgR4kaRXp8Np-IodPRDz1jEyTxM6znDrzfuOtTqxfEvcsRnwTYEDPFF6orNcGhQzTZLEPOWNT6berUk0AVZFQb7GhohcIv8Cb0_eXzhMs9kwmBIx3Fz9GDTFcilijeLduxulthqBhwUXrV2WxbIw3uHhhN_Iec7zvmVGcaJblHkuDIWLrZZ28AuMwTnoRTaCeB6kUrt4MBojL9RPuWghC5N3WojQyov5d_XoaUj-CCPit5HlQUKyMW6UQTOmInAWMKuhiveot5WYr5Bf6wK2kWfWK9U9PIXnhlzmG6Y2WmGtixcFXzFhaGPBwzVsdgTqH3bwU8uuCgkttiW6N5Uqpn6FtROYqEnm3X0VntfDTAmlQDJUUXNba2kBk75B_XfV1XzWnyj8f65wZz_9-H-H-LhrskMRtHe7HnEDBGqz4fI_uY7s56ff70JK8zgIP7NZPYcCkY0SZQZ3M7n7H2WpGQjbheEH7ubGMX6cCuqeS2wVjLruOYmDHDvdiesrPedf9RzroHHPgIaAoGPWnhOKo3HHtKlMKE1GZ5bfrwjxW1wCTYUDtFBQehzST74jhCd-WoWwTnIYPz1jfyd5wuAGqbzo_FAu0onBIXcDC-Cedfz1hiSWImldd2wwHlhViymFR3xh9UbxIUy98ob4bOv1YPw3w-Kgr5CWVkX3rxMUMLYUe2Vm2A0l41AFjfypCy7K-le5szt81P2SIpyToyRnEJzELhsplUQXv8B5MIk5jEnW6EiLrrLWSFu6TarqooBrTBQeWo8BMvOQHkrVbV8kXHfCdafsO1H4BeQJRGQZT3B_FHYSlUHfcyxF_6_OudaztSzI0NvujGdxP_Z6QSuwJuXRKl6TF_gTPaJ3FeIL56xPpWo0cSNpvq1TQi0jaTM3jyut4Emb5U1Drsqwh7vHezjDegGW9AyFRsBjBH25eEA6yF0yR84qlWR9pESB2NTlfZZ5BFzWfKb0jfFURLbejFjmEFkm5loiURiB638EIM-KCzoEplJjgU3G8IuiE8befu9f1YS7lKXw_s8-ESuhdUl0XVROGzi1GyxsnX19fAeNOZmA-Ql2-yT9pZhvZk7NRhwKhvEJe4AT2qGonGRqv48cjxK-awSKytuH0ZeXnBAHShk7lugXnt_KU9z-Naxad1zGdY2zs9QwhZBSm-LYW5k8UIeRST9JvhyN3XqTeWTDuNLmkdWTFOafcJm48lU3scbueWTBrWEL1d7SfvqM2R6c_UFGua__4-A1kFKUwiakhQPU478CMjPIZS2kUwN0QDkvXmFMXRLnHuM597SGgCKAJyMSpe7R7A6LLDEDJA0p8wvR8xb_yLgaioginiJs9NXHpauVvloCstwMARR2UVVb2Tm9seWbFdlPuY257HqD03ECgiy1uGz7JooskgG9qihcIqRFOVU_r6yTapjJn8OavIn-208BGSX9ojVcTBdEoERCloWkFN4GX0NtdpnVNqcSk6d3fQvHT5PXnwilnFY8IF4iYaqZ-37ngv7IP-XrcCq5fUNeT6V-HVxY5Tx38rOnTLQnOZ4D7BQITr4qaCtc0sZz7jG7UYOYcJ2zsqD--M4m0ZlCSf9Yd1BmmuxLPanPqvY0LCjKCMwyqvpFjC8_ATnJcuWkiMURMwgPBEB9dFsAH83pEssbRxhaqs_cFq5vl43-NCyTIhMIUFz0ZjLglUCnxsUcue1jZXeXpSbx9NQrCiLMKFN4Qn8eslvlq7y0Zd6EUmxPtlGhdLDZFuWSlAxTjibr5fhpshcpfboBpBdbrLLXpaTk_rE5d0IufMCXq7YX9fgYkRVFVnQ5SlzWdgf3BpalsFAVhmScIUY06gwclXP4oH7pWhVH0iilLKxN3kERIIfiavw6mSbxRdwndVfwiKPBpjsBNcfKx2nYA8Mn0Ec4CzIUqzJ5OF45zqNYQbaZFtX0kOyZ5Bq_T5UconwBbDXxJOC8fBaLzdKKfUCaCJwMPR1oye0HJURYcWjWQ7WQBp0xuoy96YR2nyZNG6VtIyQfbrf78LL3M1HYyBOcim54y2J3R4zf5JZsxBPBJZ6uRelietF5mCFon6lgBPoLiGKoUMn05MmJmNXvWY_yWUPRF1GvFc1whulXdAxTnSofOZGEVxqhfbmeolR3LGKCjvqf4ulsYVE7JRtSn__W_KV-RJHMSIEq1VUvRmSDJjDsbOtXUmY0ulo9nGDEMm_dEOCnYTKspLHLMOwVYqLAfLzQgygoUpXM1f5uKon5N2tbWgoFJ8IOusIh6K4z1ru30bXc3CazvU8dqxGJ9H7q5eUAHFQejdrYpFX_dNt6j-gyIsd2YYi67LrwuzQrrJN4PZM8Me5rQmF_Alg4aV1zd6hnZwy3goe8rK1XcyNpY7OO2hJ_V1udFMWAP8bxNcpDYu4lqpvv9-Xry9T6fRuFKutD28Bt-lZgZgHur0ipVt7e0StxpdUQAC_OuMUdum-hIoHxmCrxVHwzebzH6XOIfdXjpeoIjaM7WHA061dquWNNOBHBGDV-N4qfHA9kMZdH4BTssQbWENsdx6h9ulic_Pgm3uclZ1iK6wQMFmjAtrX10TamGZnMARZkxv6SJjje4J10tVd88kZqt-vfgglyP_X3jadxac__gIQBOTbK2jfCsQqIN-zb66elRfIDweTenPltOrqHWWY1GOVjXiVQhvh_O19UlVYL6T1OJsVYWhbqCZDNjIDIp3KK-vKGwUUlU6rGZIS5At7zPTy8UMiOUa20s2SNoiXjLUtXG2c7mHhgOPbHz3x2xKML-WGUN-8TFaLjKq_lYYW0OWxBg2MjDF9rpbXvf7IW3dJdqoI5JKsUeU0-eQOyhiOLBz059fuD0s8UBRqviyNwnzywxlI5Pr3VLvs3jmQC3YRxuLWg0fqatoyWWEmEilgp2xNYEo4A1MGjbYJjlUwJ1yNPCZeBE7CYt8g0V4rsddj22n1VsxS5KlJ-4lFaSf79fQ4o_xA7nO2MSd5DuvHExpmf7IFvYrw1FwnyXinDQ4J54IiMGARDnk1kSSfrVlbzH9AxoaPYtN5i_GVbqlU2myLYGHKvkJ2f7N6fwyjZouPD6DgFoH94gMjNwDbYrat10SqhxCZgQ6k9boRIx3UtPR4JKr1jjL8vucy276FfUAqYXPij-ILgp4SavTa39VpK2J6Be6G-6Opl37zi6uVmMVG5Fe_43XFckoApBNq7BJ3x9U_Pv7Sfil0TI0Ue40-yDbnTFaJIHw-p8xgacN4nCzBksKveSxs6O_r5BH4AJITephMT3wv68-0PxR0zlDzs-UJcA2GAXJr_AXaXBVNOGqgsDTpZhrqn94pTZOsl8S2WHhrP4PFcx1whadWU7SNFDsGlATkXBQcnKzFh6n8l_EzsHL6rs8x3jIsNeSaFw3Zx3kpHZjL2a6wCI2Lqfst-t8JfFuS1aBuhUriLkS89zTDEGsjxW7nl1TuNPgi_jatfO2jzqBb-dcs5RIMZeRnctM2RMrLF2t-ZzJBtmOEzP7ffkmZhd4LLHDGBWvnk9qsRjVn4dQUFFffuujV5LX8CfCJsDMMdPnZwTi-oFCz1u6pegjrzs4YvSHRfNxHOyRGQyFwGqYWGDY55NgQHO84PGe1lUOES2HJombyXPF6vc6ChTqg4ugKdSR3OmnvTTFMpNHoz_PhkH7qQqGZdhe1bnMI8wWcZTsR2oJFTollC4eX6RAgkTnGzRv70R8x6TWgF0748CEkXuH_fAaBGQ70YA5YseD29QJCxMWIRTBh6iWxBPJopFGnYFwuhWb_F4KXUAWdSDmfHLAVacFfr7dlblCqKC7M79KlTdd5CVUD-wsd0Cnu8T0Ut_E-D-YhJkvh_Q2jT-o3F475hE7l9ctVyRJG-w8DSpJwPfqODW8kIH1PEbEATWSMf50XIuoYytOthMUY5YDpDGNocyXHYlS-wOQKIVq-ueZiuiDUMeKRNY-81tpsLkKlEpyUQcRdzzWiS1JhgSjTHw3MlliDNJcvAJGnNr3F2xZsKecIMUoH9v-dsGdpIX1LI_uXFB2Hxg1NOzsUzmMLFJevE30cNINIRWPX4Nlsv6GctwvmAMYU2lu5uMxJ9CdW4fQsqUgL8aR2En9ffLONIH0C_Oj2dImrWScBsHaYwqYDbF9tUAJKdyXkQ-67fSSpVbgUAmPI64N4-WBCbaM8aDDGfFcD1j20XJyz2OOXl9l4iptCZwsC4XSZ7bj0U0KK-ygge9AAKqtWMHOf26gpPOk9MHSOgi1x2uJeABkIx0VO8GKWQVndPIFr8J_NE8IkfJ3WDkbM9v0ndPFpklcMVLy-BTv01pb76rtOR-bopXb3W-AiMpCgg13RgAIq2ehDp0Ua4EE4uwrvMKxAp48veJK0vpXAnH9sJiRW101DcMna7AClZGdxz3HCePrZrDwMAlwMU-OQAgu6wQXRKwPy435bxoe0-4zVt0p6Lu7BSqx-S8PqS5kkG0JQehCvqN2LXknofK_bTNWCHj1RBPB3-alIAAFhS4_Wa19t0uYyagBmHimD8vc8Z1PRgGfFxCUnJ0foQ4fzk_SBk80WWfYAdkWRrw99wXh_SdM0K_9eBH2fFCmuHog2lAmfjAT9Dn8X7ZrFGpUuYVOchQvvgZLui1iWQ6YW0X8sIqucDuFwKBND5HCEa6JPmQNW3xZDMFZw_Oy_mdmitzB2_Vt2u4r-rwbCC4eqFwWngrnJjFKk-0kRvgn3arPQuckvfnxe4vyFy7U6_qZJHYsKpGnNG0Lcr29L_etBgbFU8bW9D43rY03MCWQ6lwD13v7X8kevjC2Kg_H0zcDhg2YdpisFDenPfS5H0pVnJ9XJtAyuA9DwQsEfeZjwvPrLqeyehRy-ToobfWVxIgSacoGP_s5hDXpGWFzlsqI9FllPKcKcU_KhxSnrHTxC6MnaXicRS6U2Bqw7zUlaMJ-suxPV4A6QyHDRxgkOWkrZAF-aUBpXplWf8A_3fwMtww6wwNwVy8WtU6q2OJiXo-K2s0bbs_HoeSgNCewEs_qFV3OEyTBH_AeM4jWM05ItNhSwx2fXUpLtTASwQUJQJHwEfkOGKsDxZaYG-iJD-6wLNFgEnJlvSrZU4ou1RNSq63EN1zNuJVN3WDN8WpUHzkltxwdlOU1WGpRCgtzvoQ4yq85TTvTcRN8JkzggYnKdpi4Ox4TyFv6IjFCRDzxUMmIIkX6Ju04-FsZCOAEyYSCimCfMlj9VHqXEs6Zy3SMdgEZT5i67K6M1SMRfPGrBH1HZgpBhC72L6nnegCjc8CZBLtfr32oLRTJU9ThfuzJ4lxs_2d_i7I24NxC7p-aGQDT5z-QbyasU2nV06O0VSBxQqmdT9FyTZJp0CBRuyzpmAncg5U1tRPWj72Apix7Jp9DJR1kbwyWI2myXh_-ZhoE6oldEQycxeLbP1CigAcRXkykb8zugk1nV0YUR_QKq_JScUUHqhIHWFL1QX8WZjfKttuTpQdvBFEuloljQ1-bswc4ucknQKmQV5mUyzBHuUsg2s46_6s7s4Kr_Dy37wmRsIPowYt0r1NZnD0gQHRfcS8scPGsGFssPChvP5UQW5q6mxh79X7DBOCIKkCX7Fyh5yWadUJuAeaR16BebSr8k2KSgpQU3a7rxQBRzfEnjBvIW8oE3UNlOMt6KhUgFuzv9sXYhLqs3TPZLxUsoaZkGArs9mFPn9oECz7Lnsw_OS6fz_V0aTmqjrJQEJoMc1UDjlTSFJhZ7uofUSWyvgdwxmI5wrPbToXCjicc9gbUqOfmVZ6Wag4ExvAZ_KRJy7hZrijbM2yowa6vPiSONbiJO3G7gM-c7uiIMIrhhSJCwBeNpbSx8PjmYPbRREIi9OefmIL0gyhvESxqGtGrd0TKGhMOwXXeKGRDtZ1zv_Cfv4R9lWvfEolsG34iQTsTEM370fXzVaIuyIgrciOrauwZoeeLeer_s-4cvdpCHGLX414pdthGz0hfU2LW2hz9dp2odRTlvUwhwR0AtfbLcv-xArGSaIuT3hLmpwVokhvHSCszjgE0-K4K_-l4mgnO3o698n4VcMstxc21euh6fsc-rJwCEEURna3Gf2YAPAV-SwC9tYduuS3GaqWXQvNzX57Y_c1Od8D76enhCNfEFBWCrLT8nyaBIHRqBgPDp4lN-w7uooncNvGGZz3eKOBsLoLQ4xmCB3IsUz1jQ9dX4AJ5TJvRi1GXSity0JaKQkZgY1Lx6d7YZoPsAzy8vb_y9JZJNuqBVFwQDRwa-LuTg93OTiM_sX98Sexa0etrFzYnVHiw-DusnPA4T-c3qaRAUekvfV2d6jP08Tg5o5xPpkO2K2e8bNvCglnq9QWH8Zv-FZ_jTpp22CgOXwTNgL8TGT_qpoWPnIjgFLEaRj3TOTWFPxYYq1HNyxUPI25D-mQ7p8OLm2AZaw9Kp4eK0wR6b82-6Lsaal9KQxlCp7kZ_hhlwmadn9J5NJCoZNOLD16uG8liw0NT2RYMMWaDS77k5_hi0Dg9lpsGd9GUzeeuHr9q2kKFEDER0iikj41smO57twmrxMnPc_o9bDwpv5Qf_HsDC3N5k3h1QHQ3TtIui77zUrrkhGXL1FUKkqmdaYWw2_ppnaThxBmgxCHZmathi0NCOhWfSIcPpxb6vZlVPosRvFUIYGeiWcIosgW--jNSXTVn8Rdv9vVXZnvWdWHeI1zHvS5iUuKdGlzcRr8SquLCYBEA5KmrxBBLMVCsMfvmFbE5bVThF9ya1rX4ZND0n22M9lb_57Ox2c_XSmCDEIE7GggA0AcNUMEEzF9cwEynflE__1mcuhxZx5xZfdxJ4TmYkRVlZGZ8mnklNzkJjtZImw4vOA1ZyE_JhoNTIfcySoJZS3051lwee-ePjnsKA3njwRxIDjiXo5tYI6miPskQL_f6TfgIrLEUzeJjQy9XWUyYbJkQuGizabhXJ9SuJFKMZW803XY5oRp0zmEPoMw6A2UNArscngZeK1spypIBZoUbGfiRW8z6IqBqj2K957nPDRP9h1lNXbjvWF8PWjivf-1WdS5i8LaJ8XRwOJ_Vd42DeOugRQHrycARdChbJEU7OksgIEQluY1Dp8_Tyzk1iHk5kJmflYUqWLyCpoHK4qvLIBmWXiuIOclhy4WGm-H4dMvAPcastZDPt1cIAANJ4CcAPCK5HfP9sk7ap6oFhF9iP8og7Bg88BwkqMUi1If6eA-qzw7cNBlavpL-anDvJCUxfz7NPMbEq9ZVgNRFOh8Jc6odE12RrXIpxoSIKVmhdxqQL6nV3LDERWOYdk-LmoIInrfRK8Bv9kJZQ7H4IYxgrktR5YwnFVzb0m3IKC3mrvolbe2z7MD6EIBe7cGptn75tDofXq9c4I-qZ3devhUpsrg9L5ljbSV3jhiQ4m2foVqU2hNTDutVanU1hQ4Q2rJkdGwNzMoKziFZa6DRQObKJjA-GFPW3JhAYk7bjiWMGvSBoqmU3DeYqXBfICNhB4JYEE4neAHCP41r2qEVAIhg4Ut6yQz7qi4i19SvAWjmsBu1fd8ricIfQZrXfhxopIe19YyelKfNBGIu9snL_mVKHbyc9ubKPCvHYcC-hkSxfwRj4qe3bBoLOppU1uv_VzQHJTFD8deYOXsiIyeP2-YWk42ZTq3YlNNx96A0iZVx8SG48rmJwcRKaN1UUTwdCVo3sNwttp6XdN-UWfbgYalqBexVTTjp8jwMdlZ5CYCi3ObookvB0sW9VsThcHBn2_7wFpIB_jZpEqWoJ_VIHNRA2o71upkDI3UNHegGxV8-tB2cx6xM3p61cRNJf_zDTHNf34VDZHAOM1-NxoXw67ltSkeF6fAd9okzT2iBumSCXdpJJTjqLusMKPFoi_D9MnNjHSvQ5RniEarQUEsF30yM2kN9_Qm8zh9Pj6NhuhliR3wtVium_rkNozeLyYZVqboCxxzcuRsuzmEuRRI1nS52_alFBGZbzV_vVcI6Hkp7LORx0kfAodo83XryrXXyqvE_EKlWSRB1U6u5cbDeHziF2oqgo7SVLHka0J9w1j-2wpwWO3aVJoc2Q1llcMCzUW8iDpClkZ-8hRf3s6z3spVDKQAjCRyLqEmPXF7iFz6mDK0UGAaY8HoWON_a1rWNLpEGYR63JWsTMX4WVaeeY1ZVb9vQq8AYuoYKkrpRvU-YE4x2m6QBHPx0vM177scZ81tUtxcmrAmW_EVGZN-V4Jm-HFZJTsqW_LVoLpix3k6VYw9RJLJErMR9tsKsvRR7jEv8u5BtbjdAqjPll9uHZmNZuCuiUsDV9njosmaWBwRC6iPjwr762DrQ44_dPauixPrOlV8WJSAHCg7waaVBnu-AJ6L1U5AObfu-ljeos6MgsZuloSJCkjQcv-VO4CGENIvoZpzHgcvTIm126MEXaV47CspgX9UXO_eOmizovp1xn3XBo_-iWm-WMNgB8NY7c5WvUyD6L3yBV7SV-HkimGXprT2lJuiZ9vWrxzjuC7AB_gI1CL0pouQZ8VypvbqB5ioRhbG3C-VexNandcUT32V349Mwj2J1D0ZbNh9zsolO0wEbHkVbv8FHWtlEoZGKrtFSL4uLOkYf1THXVMgtKoOAKSzOnTpuwZ8wvE4YcfoTwbPtfd7MpT9uEH7fFwj18EnBRKIOQ5TO79HKQdmkjdDBzGNCmKvYQijeuhL4j5-532PG60Ek-LOUt4S7IIfKKXqRx3AiV75VqCzPMFyvurrDS9QQZMA4RiFtxeElBXvDpj2WPasLXfNk2cnTMK5fXUlimUzKj92Lf3iKk_SH4oR9CmvIgwvd5d3MhjXN7D1mUJnGZ45s0LfSbFpvxfh3AqJjcz02pgEfIagHzgJZoLDXCr8_bAJwFp9jFuG1QWTrFhdBMi1BxayT2uwqDA9JdPpo4qK2B4EiKR8ew3dUkTW_zg1-mG4OHBmvdhOKKb--xQvUKtCVnASiwMwIxTdo52Pb-pbdr8tJeetXQ0mY5fgTMqNyKD52ZzIhIMUHkOG67poRGWsMqjiAABvO5Q-qUxp4_hUyleLq3_wpzHID38kQVR_q3NWdg6itbr8BLW-T0_7YoPXccxkCVwQQENbtUXp9gfLmErcJAFLjnav5GU8a9tmhSSby90DY8SRSRNfI7R1vIzVw8b_-xBVQQYRSIJFmNwOzGin8PbQmA9vpFrGMVuBdGXFrlOfJ90g2CkSfncBgVIKQBBdmpAsRCmqWlm3DkVZDDAe3DTt4UvekSyzyuJ5uC_sEsKC4q57FsURTKex7sKv_W64RLAm9gXyMBMDN92bVVQcCVyb1xn1NyyjNFQ6YWZLzSNTvE91Waiws8UAv3tLnCTKfqIkGQ2bawD7uPD964FYehYgoUiblGn9A3uc2ieBLA04_ADEoS_Kf_POFepKJgjDqeM2KBWtBH_jj_CCWhvrrq5ZtuP1aX5xO7KlfhDsWJPfIEkap3qj2Bukh0YSSAiqcGQZGLg9IKBwq7WUSQsSttmkpZrjwLijHr9_9kooRXKwsbZBnGZ9S6XFQTCL81JWAGlirQUCYUVf1k4fB4yW4PukHZSBnOtTqcpRm-aWltIZW1fEfM4Ps9PutaQH5AXiRAVwbR_ne0QBSJ0CwI8AMfzeHA5icK9AX-5gFKViU5f78jZx74mptyAz0xRjx-FckYr1ZYXaM7dhRtVkp1fWbsawKHOxK36IQq_FXzeinnLQi88yEkrxO-iHkdK8R-TcT4kOlZ0tAiyYo_vtlH2-SJJ2q6utn9UvVh4Z7aCbD_HFYrM-q7-ymNRhKR20qJFL0ncHekzwaDhScvKkilUgUBzuhEdeo2ReA9KT5tmRpGDpyBE0v_raxMbFJvlSmtZrO1qroC1nb4zaz0TmiCVGYQ5zyp0N5yIdfiMecGQuHC1hbXIKqOJIWFhagKgHQbHxzj2Z2_IzfUaBxcId1SAPYnkSBzK8bAcKm3t4CeQYdbYrsz4cvyIo1Y7WnigvOCRNKQjExAGvyzEGUwCne1n8oPOtRW6ZpDs_jqDwd18l-Ibh8WKSzgcpkMRIl-ekWcEDlE3b4xhQk-heEswWbHNWUMyAr3XKeA6C0jc6d-pGcdMqoNcEMyLC7y8vuaO7Me7Wcn4xOe0pRkm9U8tPRks5CmigNFJ2XJpQrndfOR19_r55bZoCFftev8LFj8F-KmoioT8JctWIFsSlnpy1sjbjw9K7nmS2kIHnNNuDJ5IAocyhccXa0NxWRtdncC0Akv_lMYZpYelgOwmStgddqmTveRYZQoxfPSHNi3Ax9t4N8tepRLUP3Hj7Rt11y-jXj9diEgq9zjS0GkPNJ6txDBtgwNUZu3--hQX7I6GwGIalKXVWUvPHL323sDMs316wxo7zMDQ-wf9YCLx2nLRC8rCjCS3na-PqK8dJME5hgKZ6jJSMEqERu_ooUxw6tfqk63EZ8KvTA0esnERoykT0kpiRQN7Ep_vQjwSx80ixDD42n2Ukbo4_5eXmyNdRT2VWBcFaF4ZYTGx2hXyKe-447Gc907wHjNHt9MUoSyxpKN_FDsSUt8Imk5GHalurkALlw23YMEaiq29HQP1NACyiZdU_O5D_7FAfPodOhyvzP8yMxviWRPGRk251zQ4rE7OzJZxElDN-gfDYvMj8oSdgRJMExsDNzhug6Fx5IpUpGgxd_-g67eYtj1zxffKdiEaCtEX6SPHmDQwuO2HLtBVxSNr6a172Nn3Pk4dmNwuu26bNbD2OmoRdYCWtNiB-vuGwHhzlWCStfwhTSvuyfGBRmLwIdIZqWKWpikBZKLLbECvDbKIPCYA0jZc4tnix1r2NN7Dt6nuEg3kLZk20JlFcsI-hO659K0HCW0lkxOijmWY-lkq7ncVdbTbfacRYvG-MEqqLiufLJ-99RvdHsur0Al8it_duvqTcBEaKlJcWg87IFmU18-pjB3O9dwxrgCueXnncrWmcydaWAjTWK-iU8xa52F8BBATXAu0tBxsrF74uHivT8MJ78HBEzqVBpvgYl3448BV9Ux9ZEW8LrPVsChJ5aUuZqZnIrpcJJ8teE8zFlUNcd_06aUgDJrOBSxOpo8c-D-nBbCf1g8C8wgQu_hvKCKzhB60Yi43c87p_XSUBdIjZwF7F-maPqFLKNagYoCar7y_MGfvaNm3rnA1z-A_ZBSMFUsbqMRLaBCymK7c4NY2CBjGRDvLb385f3cQzEohRJMjyok6T9jBuF8FNk0inCbYoGyo9uMdjry6oSs5LZUHRA2-ZsWShtQcrKBE4UGG_ToR3oczO2fdOcRAQ4BNOycIkTLvVGUb4DdhyEFMlJFhzbryL08uBofneHTMCjpa1IyBAqPWzUgSAhEl5cS4h8UZQW1hxNIspekibD7XMHS5FH2-LhngbdIVmBV0zAwEG3hRB0obw8AyXxIsp39xILeOiUw33cBN1KQq35ZvZiCATSiZvulY9a3OWheiWR-S5Td1urvaQzLvnu6dbhcLb743nrJGl8h7jrh0AaYeg_jYD0yxgyOUtvWgMLE23EG-9Pi58F8GDx4sSaRgIpWKJdw-aPNTenGsTFNctonaKlIEr3WSnfY5skVxn8PgSNBppOT9Q83g2fTSZVJW6a-qXZcSGPwScW3j-RzqO7i1XGz5JEQhKWoapsXx_Gk3pNp2QuZRXS8DkWFROFFRtuZR00exZcbw2154v7DE_Rkl0t9Gud0rBriB8AtHzyPN8mBOjIgW-b5YR51aLVw2F6fLu4bFaovS0tVqBTPfa2qfztFLJAmdahKqtP5ZSAwncUkEeW_RMvDhF7n2BKLTwyvdfcxB3n71y-OYeaUprPiWvr_OMuuRqCDeps5b6JKH9GHVAqPiIBc6WGYmtFTkO8ecRfKUuOgggOBrPzg9aTrmwCB6cx_CeA_bf_eOzJvlpc8-WKsvREecNl2gmQuBY3yJZ2Wa1oGX0CVDyQEAxiYj0nuwMum71J4tGjOK200RGkHIhYPAF6LUgl75uNxFmqlvLqI5Lv5SBAtZPpkgvJVdR2jKCZkLpssDInNb1fYYaVlfpR8j5LfMvpLT1tz--0MngHnvh6ERaZilG0TSEMS1C6c_BgokMK756IIhD2f2yYfLSTRy-BA_7BwT0ryRrnh7xQQfJxoTEDS1_z9pLfwawYudqAoc9J70eboebEKExDs9JmB4kEi-Pazfg_NhT-aqGHQFORY17VsWuq-9SuX20eMTKX4CYeOMZANi20mujk9JP6X9qbmEUnNBxCq57-SUoZ5V7-WB-AsWpJDGppTcBs_AuebFonyXEToF0u9xFclui2cKmMZS17aN9CvLZysGA0JOfPXFhWcSWtGME4GW5bV1z8J1Nb-8bqVdfBoXPhwKVduxw69ldAO38PnIeD0d3bpconBNP8qX4GL0vIX8DYdmCa9vb8cr4RPRv3z_BPJArdHJHo6RSXmmOg6-1NbZIKxfMfWDbTiX3gC6sbuqyEwOb_MuKEgc7ufgMUWTdkvohzCPOvN69gsowWmDe3hoHgQfwYWsbSjoqOKfqFPN3j-djnFu2e6jUZSDj29Mk-1cfJnVUBXADUFGBtSKVBY3yR_PT68ZePq-ewUwNjtzIzoBx-tKikp04gR2WACpIdTJODfo4_rhnuUIg8tbym83rSd87uLY2x2syQuCYSxiNhrPE5jB-QrHKPql4rIAY49Hr5cbQrpHBPLhSwKPDMFdKlDNFRkOiz18YJRlNaH6CzswMhzBpPgUHneh0iciJP3Wk4m1Z2J6mUTkyyxb1Kyf4bQ3n3qxpFuaSb1B2wCha2Ai6to27-SzvNccQmNv2CUT9Y9hignwvFP0GhcafrX0_sucsE1tRQOConhffe1l8F6mvcrCQLbLqJdTg5rRuJMx-ZhHI0emhsb3IWHHICSqgK3YY6y03gnpk3iSH_SPFHkX3sY48Cc8X-G-CiZ1IbyO4Q8sDOHLrWMt2ZJWAOJZop4vW1ltp81o5nETxX-vYmVJEMbJ_7FyGQBy47O4mSKCMkbsCagWiy2Ca80LTbLiYPc3Sfsz3DM_mdKgbPXslWUc8nwOM4OdsH4JhI4ZpAScbGyy9HCmBlN0xF9odA5w6OaFRiAQp6PU3yFb9-LmeCNxCfm6G-TY8DxeNG5nT3OKHymmRBB4s0qls2r9AM1nNefV2YxHwRQQCs_Kyay_H3k0pPg561ZELtMp0f4g7KBGu7UkIIFt04yj82IJy5SyPY9JM7ohKx6Wl-sARK-0Nw7TMr348lQLG7eOedexFWTeDDa4v-CcBmn4XdUVpHm98l-CztV11dwI3hrDSNeyhX6FoUdxLiwviq1eznphu3EUFTNkMFlHOuojs0LEuITx-6PXgwJpXrfGx-tGBAWqBsnhqh92UHhwO_q45cl2twqhQ8XY7iLL63-BqGHHXbLmignhufhJvLF77Bbc-zGOwwC4VYWZ_36FKkTlVCTQM4CSKLFdV5cQRfbkq71Yvl7GVmZPQjN3UqsJCms9pAwQBVDRfgaVGk24wyxJBg6BBn2jPh8eB9ncc9U8I1qwsI7f3cxzqWpRG4Hz7Hdpt2UGkem4WMiwHrQuu6b2VX7PCFfr4hqKUgaFEdvIEk3W1GCiZzlhZQ_d7QY8Zd-U8iY8WGNBQ6AGeX32bTVGyb7TixzQj23Io27u-VBW0Eu7th639RDe6OtZ55PyE1-4lDyG3dcpNECjaENy3G2nh39UC2L4gqPM0DIr91LDGRnjT4duGAcSc0_J8o2x8-WwWRH4AVUUfHObyKCf9RjaSWFPQM44MVJIn2emt05rdBbnXtcQbRxZfZPn5aTIRIK0oGFizQaFIvjADidqsjyk8TBSgvbos-4_60goShTIFNEbLcctdSD_98CwOmA7vY08GRzAAzVGEd0lgBS330YU2zOk8-3JzANA8DXWwu3kWfqo9MrpoLVqWjrerrfsP4t33zdOaJojm2k-gRpCgti8er-jaL0lONgBSNsX7ZphRESoi8y5-LV3BhLE1DrRdRyr1GxTioxijKEY3VChKh7nfhzx1_CxOR4IXP4yCCcrI3C9BJwh3_riVKdW8beH9ff6OBjzoZ6yAPH6ICOsMFEXjJuQKg126bJs9zuFt36qIgGQkCszx7IV51etvZ6en6GcXYZFE7Y7rv3MPUDuvwfE2bLVyJAEp5bKcKGZYd7goNE9NT31_yT2T6NIeuTUkeLzabpnJmObkXO1JfU5l1ouPLQBlbiWa0Z3uS3rnD5AUrfesbFk7mrwxjOHHxPvih88iPHqpMMMNY3rQ5cKrVoDgJmCqM0mbciBkCO3MNSx8n4L4AmRRBblU9J3r4ls6OpjTjhipxzOm9poGUNV-AmDa0_m19TI_k5t4fzk9uofoX3THDY0zo-bAKil2AzkzIcXT6HJDoDQM15mZA-QTkvhx2Xtj1WfigLGB5zrmBPU2eDcaPZexP3PhR0bNXAmhGrJ81RDedRIcDUQj6xBXHK-9wWwkoTJWwgnAHlxZf5QyDqlboff58fdFxuxDqjgAr60ir9KLwVGv5PeeOqcvfPeeSjckFPu97hB6zer7m-uzqRZYosLfW1BySTyPcLBU-XAh21TyNVugbF5WMqvE8CILWONebYNPNl_ARjUVp-vqvoDV6Rd1UWk7gi2OPcjaF_zsJydwzn1HJiFQeY-TJrktqgkVCw29LQQzMBbnqs5EHCOMUrfRqsQuLbsgqan6DMEIbbitvbDtXASmvekfvh86i6eABkOWaMBIZEwcgo-YJb0tTYgsptNJ8MZsNck4w5bLwrMnHax9yj-dHik2sGxyGRxvwn6uj97E7wKI4trnj6DhPi9sxCdLu9NsPGKYHwWGxfm7X3CAfA1OEBf8bjjPbRS89kyiNN3BMhCstm-G8kuMbHmuYtzhh_ttLo0XNEkEzq4W39r4gQLBVDb-SYp3y10L7carDeg4FtMC7QrhSTBWYDzrJemC31pQuT2wlVEB-iYBlgC8kfV81JjHCQsCVWwx3wf9CPTv7oLlinZEAIJbmAwt71Nq-HnuzHQMXfSjMcHRh2ClPM_grPFULT0UxpBQz4M3FtAEAkCKIsrAElmxPcF7ulNX8aIivAyeve95EhR273_XyXkMk_eC82zDEi47psbOnsstafKSglY4oYkblyj9fhKTMGXrGW5JS2etgxWN9wmKAwg6J42WIjqAVdZffWTbvBZAPTockLC-29uVz5WS5f0EkrV7UsxXxrFOg2SKogyjS83Iw7QrMFV5StxOt85EGSFuBszK3KF79uWrt6GgX-r5mCFO1hFCTnBZ2zYPQn4t0wugQGyRW1WOM8mdV5WKon8juCR116nZzc8Vj2SPdg5fjVRJaRGvuA4khgRQmM_KkzRvL_SpwpTD0qDHnVTPXo2rgMj2xwI-YEsFRivqr8y4SXS8CBJ90CUwJ4kNIeuy71FRYtqPaIVXmAtQBAyrsoZ6VG8QuXylvUuYza9nV1qT7m_f1loV8vjrHnmIUTQCxIVOE6YsiYBKqKkHymlghDOo7ZlMkyqyyJEeuW3cea8ib0P9QuKB_EJpCOcyx1V1PMlQHAaTreSrBYjeqyKjuocgAGyBM3ix4_xAkiGjS2FXJ5hrdPneXAOkkeT4Wcw3rhxJfgPfuYrviYnuWUNaQo0wa3WwOMx8ReHdJ-LsYU2kiJkjLW5yC86Iawh_yUU1n38K5EpbXXq2dfiYcxBldOQLiRXdlfhRO2O50mBXBGcyBt5v74uQJBY821qtr2IAQFrqyaTjqTrma0qpQKJtuO_KFkg8KCq8J3TTi-6TsF3C6V5hbShPdtpwEcP4meswW7yncjpsSAx8d4xPSaJr9kIEU568MQ6AUzNOzsUZizP0oQ9Vx8ftiIRpQo5TkUEY4TJTi6qABEvDINSdcJjjqO9b2F37IPfxZrbzzMY6ZMcXWVh6XL61CVSFxPOHXqk2ZjEO0WRuAuUlHf3OQ6IPLGiBH6aDY7ii5CADV7qirz_QmTRuFNkgloqlxh0FYI0S6oYDr-wuAjYUBQ2LKz2Dv7eyScs52vbA2s-17Islka95278kML_mx66i03e9sylhR7B1pHTC4KsMGP5C4XGt9BFwNkl_GQ7qOyd2YsfA6MSU5MKqhu4ndm_EaG1_GGHipEzy83X-yGMH24L0uw8c8kfcROeV0Yz_KVxD2JD0nIwL0Hc2APl3rPl34Y9m7-gHorZ_XdOCute8H_eAgdvV8rzZGJBRSicNGb0DY42wBRpEQ9YRVo8i3IlX9VIovHVSz5yysiknBz-x6uFVNgOZ0HPCOO6gFsDX-KQWjMtmB8J5tUMJhx7WfHj6Z8sjsMy--7NbQXZG4U5NM1a7jbEjo_RXkdrYudklmtqa8_LOUm6hCjBB8IxgKt2KEg2u5kfi5nJ1gASWmLiZKxDb-kmX3Se2dDJtdvNuHUMC-qtJVYEPm1oQMF897I_7ZcEMayz8DQ-pAWZfAtUJWNVKEVQ9cw73YQCOmqN9Zonpoxv-kfQxpBvy3oakSY9tK5puaaf0I18IM6HXs3Nnvl_CHjX2m7MwW6u55Xx-TMYhNCZv4kKCUi0uLaqvSH9gGaE5KW02qkKHxs2wm1UUN-d5VSL1-XE2YIqOmOCPL2qm7a0RjjJFeSiPQ3JNxtIzeupzbD94nHsWBfY0eO13-IsygmHWbmbfYerMyRtlu-UqgNM-142TyemdJ3yQgGw8d4YoZr6gEuJ9vXNgpcNUU9OIMJYhISPZeg8psbfRNUp31sxJDIlSPm-SELMkdCAdBbVSZxGvJFz4T3IxUE8x0DqNBBHUajJ-HOtPSj8fX88w8J7dVfZgcW0B1FCCUIx5KMd9uEjHwkgV23WkjeNgWCrW1flrKOBGi3r6dGpAYF2Bgz3kr7MFLam6MRNi2fGGAkbDwM5y-7Ses84QlWTuz0miulp6JAA8929ZlrPTk6MGNo806qxu3QB_WzF69MbjMzeIOm3e3p_j3dLsCZvKPCH3-H9egTdNMWkSAoaweilOedRNEXGA_qocSq-bDHSO4hfN86S-TrTJzNnakS-UPry3NNaWb6jEIUMTIy_16otdGUcHHU2Ih4rHKqvEURQm45wGjutYzZrSTBJ0A0CVf2uHv3bk6LCoCVUXqisvM-59F8vA0CqMLemnNgxymwbBqU-sQ8CYwgzuncGyOvGjT-4usdhd63XuL4o0wy-GwEmQNyklRjVaoFG9PDi9vjy77plqvV4QFszaL7s_dd6iOljoM1ZFfnm2n8EOzwOaHBqYnrhYwqCkg3H2bsGDX4ddncGsk4XOPBySHEllTOf2hTCcZBK8ZmaBXWNkn5V8iAymKusikAf5sqDYWlPyRPWTtRSgr3K-X_NCrmBdoMXbeywDEShg6FjVYeDzKCgMcJvd-J3VnpRcOLepi_zE8wVXFL25-ALX6325MEtnBA4UrIzUMayiWoN6a5zL3IfgZe8mDjtKkSK_EeRx5gCdEQdd7ehLyKMdI-Jl2bBxgkjlhCdePCUCHGHLBaO_sE_ohQdXapuMgxAKTpqP1t0G3d8X99c-hsCLF_WRXSisazlf5Qn717_SbEHntqIlLhrrJAVf7f4KsD4vUYTSsC0cEZLLjHbJifzTfUwXxx1Sf6atuES9S1X8Xvk0zmRuo5R_dQwmKWB80kIg8akZjg1fleYu57M6DdIiELXmOutlyPMphSrY1IxU1HKE7aQhbud37Pf5O18IH4y4rs53fh4yZ8XZiThihfWVdb9Eb14m8miFzGNqmhEApuUUXL0DAwKtPduETCq_FBqiqKwUk1V1JjTzQxa4EFVr7ReqErb4A0D8Syny1cREr4EJ1TrQm1QFKDNGwsPbw7HfYumc0btk_YiM9fPVnW1PblEMjyoFzTZVWakzrB5A3zAHe16BRMVMMsekGMBoumRx-kh8ngzt-RJ5ANgyPs-vJrcPJ_3ckbAtYaVv_1wYBLpk7ehgvUjT-qjOumTOy-rDY-qrXL1w6gJuUCS_TVWORIHKHnyU1TNf7uaErJkhFoE_Wn9_cu8WOyeyWdF1kMdQZgin9qQ2m9LqIkTCaMKxsGInPRpCWelW6Q0mToig7oQgXLLV7WyT6fTDdACKyEhxyXb7ce9qP0EaQY-Ekg2KLxx35nwM_I2nGRwXmaOwsLJ17bd_-tNf9c4gqKbNtgHglKGUWIsCam8D7CKu-c1BRmahx7dB9xrUWQo9GDrm6o-nKiYqgoFXF613MJwWlJ4TndPbrmOksqhfss-2r9rUkY6gjhN024iB1c2kd6XvoxcwkW9v3a8pG3iXqbzVCoS1fvZIyWbowG3bhNldlcHACAET0cq8rsxmKTe5AUEzLEXntO8FnCnonBcnYtYpe2iegHxOAuxp9zN-31mM6AhItBUMQo1G5vin-ejHfb36Lg4IcRoephzIrSRxgXXQ09tw2VRVFWULlIcCgjeA2FK4V2ExA8e7X62tMJOXxbTbK5SGNKzqKRjmcfN8RrLQNPaksSvOU24sCyxGZXdk8XVHCC3xPVAdv1c2ETJGKvLpH2XLI-YcN75JpDM7ymB4V1Zo-YGh5YRlKNOoS-sERd708r_Nxgr2h6tWDrJ4F2HYxXbIq-M1kl2uVHy2nlt8Fn1lZUtJAfzo0oLH9mfXKjnAG_NwclWDSgEktbxFcD2x35pgKDC3FZ75SYBymUkKqwH14vDmO110do9BoCTSBAbv4k6utncQwvxsC-lGlemWALEm11V7_kHHr17sH5_jAQ9PI_dj_84qLOzekEBlCGkppxwgO22xBn8Nbl3o11azW8fswg7snI25GRcVNvzcqaMsNbG-HoBOBRh-wTvEX1CcEBTaI6SGe8Sy7bZJN_dzWPX7Isf_hAcJuNy2y92cK1BdaVL_c7XvAGiO1_OBGNmiUQE43okKydEBth3qRUx9rOlucvHDzUcYjIJT9kcanPvXMkB87-8h2BWKcgaFy9X3dDNwPnr54HHS2b-03styYK2PRRWMnK6m0uzbzkukbHFF9oPIpAinMh1hfDmR7CTJJScj2T_C615S1Fbr1HS-HQNb-iLTvz7pNfMfVqYWtZMIGWPqK43l9IO9DfZgD6nfsIFICTRQ_bUmyGw4hylQHUMK9CgoUMG8HZLybyLGBOwYMFNcgRnUW2hdSeE87-Bdi-mSuYWQHEaIzlZtciAy5Nkq0qQrhaSGQ0tI4HfEyQlD5tZf1QrqDDWKvbpGvkOAIiElKRe4t-gQy7LSbgLyZkrsKu8QHV3sXSNMWioEI06YTE_faEamNJj5zm1IrCzbphiBRAf4v8zC3Wu5CiJiFTDdF3hj4ks8Xk4HKQpABp10bRCUNZLm6xgJi_Oi4IquVjpX_V6eXgyrZEHW2j4XjDJs7S2Q-sXwVOGR0ttVGFY0FApfGAqHTULq5EOMnBOCmdqH_bbBlfcbLfHOoxRM7MdIA3kh0QPcmrsQw-DX-j1UPIXPb3ftkPX50tRPWQvej6SwYWzwGHZ0mH-Wa3CB0txSIL7j6nguepycDgM9DsFF1FPl9rCJOWV6cQlnImuV_pCgxdtNEe5mupUrzBJTobFZtDOV8sZJeE1jW-2gyJM9O-uAsFyton_1BfuyoietlTpx10Ujy24OO7-R3RHpTuAl8Yo3x_f-u4GimjXDe9uzT7tzPUgvmzt7Wgp-6WTJr-x5qHchcoHTVLyV7ikETlh9LQrYvxQYMnd1FTXs7675GiUYhkDBBhHqBTRrY_McxHQbsT6QEPKc3OFDGeWXtSlXQeoYh_LuVL2USQD0GuwHQPZVRlHUhE_wXEnWx8L2cZaFGTOfCF_XtdnF6ahAIIw0sZVmZaYOFlnh-SXqHBh5nqlLJOs9BjdBTgkdzGlsBwrRk4EWDbxkhnZS8Xuss9A1xoddqzIVUXsN5zYmo5Q0k8ZfrmMjp9e7dqRe16xBiogooX3aGBn2paZ18bzXfCDiBrCkhh65Y8L7XMi3re-a9Qh2vYxNWG9pUx_uv4Y0nfxdBEZQxRfNQZkjNMljxHYzS18FnTx22Q1Ft_QUiuSuItPsricI1SwQRiEWgPsrJZaO2YuECOIKUVuwkwIAs2tDLvLAkjn6rgmfDLCAjHKFnU9M3QgSFyZl5GpJQsm207FCYMvWf1JopWo5aKndzSbHuIFcg9YNC_xoA2DdLySCytFJ1sVvMN_wcOclyMvIqAGHHdlZs9e7261ZXHZ_lI7405Bk954CluTLBgoCoIjRpC8vKpuv0TCaBFzSAPvMyGapzcldlNHu3oCi0A3tYPQw0x07oaKxnohQ3Ynjp6Zy7wO9ES1ymmQ7mAoyqYpPz7TTR3LtXnaRvGkz3L5IqKfSVKd4PlXKBY_yz_jB85HJYSjTTCE4TBosN-XoKiwPNlzYyKb1VNj1CImRlwbSwY3Q9VSz42QeZWtHlsK1Q1VY27iNzBFxQwq3qVXA61GtstpF7M4T4WlGdB9LKfAhTUEg46k7rh5pht8ureszRPHTX6z3YmlZZCynnXCkDineyX6IUVmyjAt8-S_9STN7xgCokHtpzzzowhdM5CIqtuysI_J9hBfUEBhXYqrB9M4GRQwYBIKDHxC5NIigGCkv1Lgfv4rk-ZOEIiH_EghY5iIN4K_sQkl1HKpd0eFEEgBxHPOn8vIuSEiEYSsFhfPiIgMAebWZyojtyZMXLOmtU-JUT6SUVKY5kdIyCNnPTLhebK7vWTamQ4jkQTAhmJrnUxpGHi1AgFqgkCGmng1bYaASE0EDgftNT5fbjii6NOHZ1nCC97GxlyEVRJyFnvn2dkhtO2quzQMsBRUHwILkF3ucHfAuMCvjAxyK52ccUG1ve_Ef8docN0kp3cOTmDG6XPEId0zn0fInpnXhbq0btse8GblU9gvb_9_Hgrns-vpBEFXRhAelGRLeYAeHIZTwnW9hvR1KkqtxKtudOirxP-2Mqd6Alcy-qy40Zc3-MMb4xWb9LUmrRaNtS-VS6xiBih6n5VwgYiCPc-HiPyCy3P0TpEggs9rm3KLDcpLDJGXa5GBQYk_J8IdfIz0UzXbs_kCaH-SoAuYLCUDAlo_jKNmdjLsPgih0QryYa1iqFHC18SivS9budUSBuYucq43ntSmP-33gwbiCb-UcYyha7eFhI7VC6gKdzN45BRiI8-zIObNa_enK9ikMENedbhL5Luvnt_PFr3N3FNIxMsMLjAjZPu8nBfJQIA3djLyc3fi9ie8guLlr_txcLIFMiOeW1CcSjTgsElEiyYxh5UoBIKnoV-ZmXXX7ZlPNdV8lmWCax1h3jUopFDnsVEwQdrzp37VpR5RsF0ZiDzhyzZSmA0HbDz6XxUPXQakbDrXepYapjFO5vol1xStUKlNxbmyPBhASKGoQ87lrH81GEkEQpkkjtezScevzHvArUGpbgQ8KVDN6OhGk-Gh2Ca3qYjPsfcdrjwuPlGzmHulPBN1fKu1IPs4_qE1bKSr-FN80XIDEhDxPUyqtDGnuzjo5WIjlvxeJ8M51R3rneO_mLwimnndq5k0DFcHijxAEv4qdCkiAWhOULYGo2xkY5AKdD_ADOBiIr7M0Aqz8pvceITscP1fKlRi-HzLqbRtU81wU96w_ttE9THh_NeL3FdYzc-EmPxf0c6xQEjw_55ebeY1-0g2Hhj2kMTfbNcBGTJfdoM9ISrLjPUZxAa_8umASGWptyxMoIFMcMfIC_TCeIE0Kw4QQquVPL9ssZGdw_CkF-KvPHlWbqB0YrhFA-In7VKV_S91o-TyJlM0NnFypPd0g0KoLcYJ1OSsL4zFo9Pp0VFrWnfzu_KDyoIaGlG8mAhzE8g2PI_QQkmp0J-b1L1ClNUkM5LJZEAoPsshJROgSmk-EMzrCErHAWI_OR7mR14ad8hJ7M4ieOD3R-Ed3BSoGI3LqUmN3V0EM-RHa0sFM94DSqs9a6Y8PFUzt60a_Yk3OMO3gAAMW0N1YipYmAPB6qldE8BSw4gvvp6DeJ6tpQzO7WeAs4YWsasTq0TJBq4sv7MjmK321o6tPR1kojv4GQzJnv7glzqlR7e7VaLCQg9TdNNkZutJYxLkJVsR3PZs1eou-E_9PM4WXWRBT4yLTGFwZ3-alQLod43QlzscGo0NUYEADQcwUSkgSb1XrCmKQPQ0D46gThX14NFTghgYZDJ9unUq0YJrU8f7N4ljC3ZL-Ad9V2u1QO32SoPJLIBVtwm_8OyvixYMkTP4AiAwSS7vAabO6PUN5R7FYnX2Dybrs7XhVYzeyH19a_vZrL2ay2ka-FcEAabtVIybj24XF-fpaN4L4lJssP-QF_RWNFHiYaEcEIiIUjePMMWkjfE3jdlr4kZLEtlcXFD9IKfD9FOuyQjSKhMq94oAQ6DA0rRFGJ2Or08M2kCAVkEOLKXfe2CWpuOhTdL5tciV7waMjapghyVrvJhZSrvHBg7sXc5SmvMDRIgjcVtiCXzI9kkchz5j2r-ZCHejXuYPAtw_jcrmQmuO-kH_N3l_0R0Ei8pmJWDbyO55hE_ASjd4dIB4LsTSNPNl6IEYNCPXS75ZNqbbnnLLQa3_pvKRnvv7DOzKPUrKZVJ43iZuskYlDKtQWtcmTsXy1xkpcQrhRYDrGYfBbPhVqYxnxc_3PW8811kZJ3i_ix7230Up1eW4ES0_bKt2QYUOC6q-EAM2qbWFV8ceJYiqL-Qy8yDxf0egnTZVH1xgjMh3Nz7iAoePvQApcP8_bRMHb9AwwS2maWE0YfRyWsLybDFTLj5GGr1JpgOjKzgoINHZZ_1V9UHL-PJS9ZNqNrRgEDgY5hbaTifRnl8THmq4GrYKWYzuhnKOyuTi6OC9hJYl7R7r5jnEXI6nOo7AXc-lUzqJRMPBW3qG6IlPCP_beYwd6ZskO3OspeqcZcBr0ToIW9EXv7Y7ee09h3n3w_bpS325cNQazmkUXUKxiZcTJk5GMqEIxM6LxmPOW-Lq75xzXWTn-tKKTY5EEtZ4UkojFAkLM6di2ne3HrO8Pe5i1anFvL7K91N5Fd0HgvZi1pLcxKpHP5Ni-gzQDHwWbspmI3n-xxmD3G2WQIAcdnjRcp4uc7sRNi-hWpcj4sayh-QvAtra8FMX84Dw2INe80rOjrD3L4JzOvYYgivycSz1s2ndXVcxKh2Htd1RzKuy9pro_IbticphFmSxMK1t4MA4irgcqJH9WECmkZ9hKSSuhvIM5FTxrZgpbByg0-9wml-0WhnFRFuL1wL44t66Fc61RAqhG6XtpZprQTg_Ba1r4wng_fpPQLA8-CnJL2GUgLvNtOdlRvFTli0uF8ZZESbc2q2nr-OOM3xc1VgvsdrVvkL6HvTaj9A5d9gyWXB4N-MqEtMVo846CFwl_TJFt60mS1gGSVxsUUQYfgBt0MdQxe6Pfz1xDTHEKmOYGY8HaZt-POoKmamItim5BmHumybKOXDL2sj0sqXBk_SLKuprq6cvUJpaktWSsDqmKKJ3x5dC5VQGSV3WRG4laxQcmXa2ein40U3SCFN1aR1HhExkhJUEV04mcfJ_PQJLfYp7uYMXxjTvlCaXwpBdI1a0PNOtJZhTK_OmDaMwHlIwijtHEIWJbx2rtFH9OXnTu3FpdqVAB3pEpqxO7ZBRgqhOkmcER13UNj4824lNInDErIzGdL7zZssM6zqqhvolslhZLefc6gm-ZVl0uEHPKXVYRrUfj8Q5O9DAtFjDwFZbhko8vkZnrck544i1vUNkg2X1vOBUjXqbUTbCuXBSUn3Ldyie82-SCmvXnptCQ11881agRVaNHQ20uXWDm130cFucDuAXzXfR0okH8Jy2gZYEZ9-5olCG30QVQtPM35yEL1G9er61R-RCpf0QVhFZZfvISQBUmzKQoTgVbfIB0Deg5CGTxLuGQMZHXtUb8I7VfY2PXk7HXD4ZboGp8GifB3CvJZXkemtOVFX5oxk0z3Et-rmES6Cy5qD9EYFhmGgrblDhkNzdeXNy1XLvvfSib6VcPKVBZia20jcMDYtoCTzICzG_qBv_dkgYYGinl1g_OGlVCGKdDdiW0mFtK4ih4mQdRsBtQ-LjipR9iFE_kzORFq8envkOT0k3P4kpgxEnCxrEOhHu9ZvqDHxsFARZ6BDSZJl0plcESmVeQxDXilraJRK3kczd_bvTgl0_AynxmNrCGtzCmOnDkqZvYVK-RmRZ4svFdoT9KZ-wmQ8jq2K6ZwShflyOegWsRzfq4KeYIpgr9GJVL3ecBNyh_HGcTyCooPYEUiQ9UcwpRtH7cvCAZQKBlDzV3uQkYGjYDyEIHBXJYie5rUwFUWogdKpmFjsO2Fmre9613sTIPvQbIDhv-2Z-eeBRh33w8t2y94hGJzWIcGD0SaRbRncgvi3C5PidgBTNUdFNKbjZ-XpbkRvoAQKrVhf7IfqukHF7cMyxhkMt9YgWJGeCU_oI4BhMQFXognnl3Gt7i8B7cjeLxNPwkT_2TUFvdIzcSnuNzvJhNG5H8lqX7yunGNMSLReEozlvJ-40Im6wj1S29cL3w4fkrKv6RGPTjLcig05yDLbGPWGcqBOa56G3Igzv9xTtsngbE4kcj5GSAZS-WGk1jqOByQkEjkyYyYkq0XslPq4MbNH3AyvesvqvQWd8DH-ocAo_SsrnUU_nbn4XHCV1N0M0nlhqfffI7g6Sma-XHo-6EQvZWRS78cqff1YMTegnuRRfRtfx6HaeukXlrE1E-VKX3QDvAb6Pd6ElXQpiFj1F2R2c_X6x-lHQr71ivZ56vU4CaRJQkW05bfPd6SAGAlvrTqwtqPlnYEz3Hp_gdPYOHznIjUiOrSJLCLKQqTcItUBSLaRPuY7qP7em7NtGDlJnxOxJraXWVbnxg9vQrU5ewd4Kq93SsfXl9eHdkKTV7dgVEpqECTOdXvVlOOQdoAA9N9HUspQ68VY8UxgPQcEiNGsrnOYqrBTVNxcer0obl2iNO64p_qjfwI_DcbIQz6ZNGfXYlBbLJHsXFap6kcoMDEBTMSkzd2evc3K3tvq8fTun3iM1mkC4Q8UScr8I6YpOQl9jV4u4P-qsG6q54qAmixvxuuVj6IWDLw01yg8-jpE0AU72BwvVyg_SfTWtGi3mvVfaDB6cs73lLPr3KstfnHw_6UdWCsntVkWQQ1WKaVzSM6Z_yZBiq7eg1wqgNnn19NMSDV-lkCOfPHkq5wh4Ulqrxvn4TdR7voyqG4fbVT3P1O2dCKcliQiymOE3npzDf55e1Us8r5wlWnuQIdsdWApRFhkj07CVZnQmdmYFCoh0in0C4UsFPe4oftiOlgycKTaHmv_fm-1QIr2lsmvge13ZT4OQsgLIIixIEeGaf41fGDJ78s8gSlYfDqgqxa3_oFyGrSLYd-IWSMRei-aCFp4qXY0frzOamxIJUG2_d57hm0E9bPXk7zHb32i2msXkF_9B00z2kSVagRWN5tm319Ek6YO993ihw47PUbie88dPxyxc6iZdIz9GBrNY-gjAQj5eJn0wfq0gkZnOWWJucesERQSijjhQgnDggPQ2Hc6zyBpkhNuaZNK38HBs01vFLRZLo7TnL-vXjSSRUmxNh2_T7sOBtr58NXJiQ74K0eKdTbtTgnyckupKvcnxH--DsGbwRAWG35dtWr8FLlsKSXRcvoO1ggNTQcSROk_ZZWVWTCsZ2n0axRaQjGfwpHU9WdYe5-dnY-Bk3Qm_jyxjjqDYuQbogCK3MGbW5XsWFzMVmv0Qc2F_AM6LAsLEDW0v0oQCtUvl5ASAoHQNi_liPsFfm_FEmp3NcJXxN11_T1Eu5uYZeScnCc6AakjPAnjg_VRGcX9zLlcevJGcviM2VPot4_Ow7NYDF9jMrdtRj-5fj0PL5IN0Twv7jl-s6RmTQNYl0iYAJ-63Wnzv1RvkEyquiKivrCDI9FF324o_c3ztBAOGxktr_Ec7cPGRgO_V21XOHn27CQrOitBUHUTrgWM3kvTCEksPS6hhWHm8C8Z6h6qaHS4EX9NHVrJdzbZXnRwWcvBLVhxKx54SiGwwl6csHkJooAjWDRg8Mr4ipM6fldfCKyv5Q1uxKG73VxVW7puXirMBrzc6ZuhwkQoQA73Ua9uPPfqIh67jAoO6cVBLff2lfB-Cfr75mc8g2PA2W1UCp-oKHMYxeEOFNRDR7JZqxifbYIVdhYQyg7u55hWuFJMefM3LEFsmwhOBGQf6SZh0vLOOuavhhPRE9lFrFwFiOftbqYRKm9g91rYUDQt8-4tCMnd9XzzSkD0mwSZXagcUv1DkepFeU7em3jkLbIsne80jyekn6MxIdWaxagaDO-5BCkgURxPs_u4PzonDGgbqkPz-WipyOsAj-DRCS0n5z-C6xFt31fePm2MzuEPJC0UmtEeCkceGXYwJePXH4sQOway1qDcWpo9JmfhPeyFIszeMCYbwvuXL5xWK2oBhnNy9uQgSYFpLiYleGDmgFUtUDZWG1l5sitiVmlHrhM2XTO288Oq8MBR7ZY-2IjPC6hVvfQNfEVWhP8omybcVwL_vCLLtFVE1XNyYgHlMa3Tb1EAikXgCSEriX-t6iOD9mfwvCR6BG4fMWIqiyZhOszl9l1UJe6quBrXvv9-hfhjtcuOiHw8_eI_t_NmpUUzrIttgTPy9uXNBi-EoRcGMOeHdWCPch5PI9MmcTNoL15gEaO93GaNaOM2zvtqxUcsnXZ0K_6yxM8_dZlPE5aY0jRBYGAefroyL7ouhPnrxOzmhfldO7O-9abgWY6xO6qF_vz0ZMtWIzh12dscCfct1D9mjIwXOzynIOInicX24Fi6GpEAWAp2lVKBr9yUa5liAQrQn9pywk-lYKbgcPZQ2BIHReCuXgbvnkEGnHPKZeWMJhJcThQJk1aUFuT5U-1Ovdn5tHSGpCQl-mN9LxkhzZqKDQ2-GclZrF6fQQeQV2PPTtye1tTpy_TQH33HG6AEkobS7DJxrD1vYcyBtUmwTThYYhQXsghjOF6rlpuzNu8Cmz1ZlIRYK8UaxZXVdAlTJ-l_5kkfMSc1hWBHomVZQHTdGJ2k-iW3NECcpcMiZK7p5BnAqkJi1Cw_ulDWc420fvKWR00x6oeXD9DVdoqqjuFHmt_Va_eSVlLbf4V8MSxXX6cbSSz3oCIS6rvboGJ9nG4qiKj4b9T7CtzxPClAU5wDGrNlo3PMKXTIwI0nEM1iF_xiWrumQrSYGR9t5SdXS11u_N6bAhrhLaPei9jmTL32NZzOv7BUzjsdFet1SC5xIOt4un3NgyWL9su_oHeLuOrig3Zy6i4EsRuxvcNmcMPWIUvPgoN7qYAAoIh2MV3e2z0Y3-eT3VMcqGlX0UoW0O0B05mDgkdH-A9X6sJbKTenYSF3NVcbjHJAbnhcer-TQQsaJldxzvaTwlpaOXtethR9EJIhogym2hiOFONcckG7ZcMLfu8qBuvbjZdkKQFIBjKq1zOUMDqObGLdQIFolPSsY4MmT8mxEY9gx8Ks81dZ8DyaRKohJsRuMuOqK_IIgIjtc2wl-FOTAT7X2YKi-LcL4RR4P6W2xznnW1-zEgnJ5UkXwMmUWebZjNH6e_lQiNrjgoyuza1-APNvKwN3eeAOE8x3YP4AtQX5tbXeVZsGdEVDffNawqd2tJAer2TPTewq45QljjwmdiO6a5xfoLTR8U7uHZ1Pdabsz1PIFRcfHjP8t7EJJepwqZNFSA3fpubcZzk7rT1Oqqd0FbGocxdfizbZ2OIys5EIemtd1wzLSyNU7LNEYoYAgCzaCBBo8cy6Gtlc_lBwiLl6KOkqlpcek9e2683WPDI-24f0IWzPdOM-k0oOl1bvbqZ7Ssm84HO2lnm0c8I2J2Rjwch8nqxFpP5VIFVsyD50BhVt8ShWjgbYXYwI-TRDixBPa1SStkvueCI6dy9rMOBGGuIzHJq2O-8GvFDrgWlXBZ9RxGF_EDHLPQoh-peZtmb5ar_cnaJEWQvI_FSMBW2i2KTC5s6keXkiyLNMh-exXc_Xi_4Ncm4Fih9sZyrL-8fFmygdSvSCH69iXY-7zWnsxleVA8-RP2wdMunWEiKK6dUvEkVXuYh2mI8qhn_gm_qV3jDWB3OTR-591ivVYxe_KRUKibkLwIYeINQ6Lr2o19xqMZYagH6Fm9bIyLOmL7o_5syoIDDS0DoRVUsEbPE051dydkIEQ73RLdPiz02vfb7raT6aIEILcJlqFetwpezFCd6tNmeU_JMaogslopHhtBrYvDJfmI4x0olf3PNnRiOCN-Fcwoa0NEyhVHXaHcn9RFXDtOJ36icQZz4WyHdqCt48TKW9zBwHq2KfGoXig2HjOKG862rGHC0vY1A89q8Kq9JMhNx45wuDUBaDW6rF2LCuZHMrnorsehIzhcgkq1ya-6RBBhTHlRoGFODWWXq2GRIdMN373y-LRUT_7S3xpccT6gidfKVAzRdPXbITB8yNlwzfy5trTwPPrAdVnAdr0nJEtAwKJXaEvr5bVa1FSVFIKEzLSz5k11wwgf0g5J8bSI255hXkzCmMBKJSBSX7mfrGvTrwo8-BOEYbAA8LgEHiaAcfNCOxK81ol6LP4HELShEaP0ohE2aIecaosqqJZMv_lWzT0wxwPTc1pFOS7yNgECvKA_DH4tNNtGjKwb7L8BIhdLSk_B6kKG6ph5QpOJkUYq1KjxerzSReXxTbR12gh5kaf1KkVhVhPxiZFP03DNuInwRWmSH1mNFZXYHzSlzdmmRs3caM1mL8WGMNvhcWIiGUJlwQfAeyM_hlNHylcXVq4LgXoP5bC9w3I6phBw942lcr1FK6TAtCkcsjZ58U_l17BaM8h8kJxu0S0uJorU865XCG2inPnypt3wGkNErKY24BCGtw6hlNRklQO8dqHFt17x5gvzrgBfRD4pe63gg_oxfgC_tsGwija6wwL5-jZ4-bAPOFmDWXi4Xp1XnHI5XNcjxYy3IFB0qdFj_23sWrxBx-j7ru7DYOR67LfIdW3_jMKQvkg0grGuxOA5E85SXURVlbnlovXnqzB_vPM28hzXQmy9Effxu37IqKw_oYneRoKcHIS8yCHiPY1Kp55dhbac8RN0gUb3owpMQ2FcRI6GHCTaWefpeCGSao6c3VTorUMj1KAqZlivtvr4C9JlEZEKD_oOS0jjjne5eKzYpaN8pPWhmcqPnRwfMADVJ3_zpRMAx0XmyvFlVH-Wyj0Abz7MDlLhaIqmbiziAsQxhKRpeSNOFPgt6UVzqfK5p1GNZItHOrccFF32QfekoVUwpZTSMyNKYmfpU4_k2Ch-aGJPqW06pBG61ad3UpS32Lbv_f5h9sMEqS39zKRpB9WbjW1hVmO1nrcNsXZisG2hFfrrK9cAdG1c47cqp-83j5Ce7XlY-NoV0zGEn3JtCfU9uNGMGbhSq058B17JTyMxjkK_6cult6ppBuRZNG32hXoJ8-6EtEZD5WlKXii0TOgJQUbQqz9-Q7S1VL91yYMKHtO5OTzd2aRRbj5copeRy0_euOasBIp7OIMJFWm8Ye4bAeCy-HXKKy-5SXPsztaKnCTtpX_Uc06_gyQorQTOjp5_c24BVcCUq49q0I8cHJlAwN-77Nwy0c3rI8eN65Q2hOsCh7F7qlkz7o2WUw4QKMJs50euiNVHvmNSJqbhip7iQI9ZZIpdzJOvcfpD4kQH6we0DKBMJeHhMyTvJy62x-dpeSG8asPc0uo7GHu2yG04mpjSJ4rCYzZaPNhRL5_X59pPQcdRJhEI5u_1SjU1abCwAdoRQhFap2O6GyWryuEAq0gitTLyS-dnwQI4JcawE5S1TlgIX0O03dzjGmk9bDAP9DrebbAXPUQUOovWER0vPlUGTaofwpW1sd4D3AgNaLHGmBC07hKxnCOq435UI484TsY01ZQkeSArUfQA8tJAZ4HW_pExG139CZZAbpkE8e2dAANLF2PmR-ck7WuZuIzpYdlbXmGtlQkfnrAb-cZWvTnqGzW0UNbWXFbYBN-dY6j6j_tEJe7Erx891r031RO8JBwqT-fmMOl34IxDDKgRDZC8Bn58Kg-1_g03H6NsGkxrx7DJDclJJyrgCF5in6iRF61iEZdEo0FGWYdbt8ptpULLxYka9FpqRB_eCN298uoi_1gtO2wdRRnjRwRbF7G7ER1Uy_SV56wfHr7NRVvdxpP2jj0cDodGAZdvXJTG5aO7KANhWj_4DHGveHXxAyzHEJN38dTNFaJo8LDIH9jtIOiYFopwO5rvFRV-Dmju_j5_dWCi0bbiltdBD2F2MwIEZ_iuvaLM5epgbGzvMBBRjf9d89Cx3uPpq-U9erz0cRcQD8K5NmjocqUybcRD_vdqiTinZsw408-tBvANoxlYy0ryObNvr3a6XV5abfmNFURgHRdwu-xLdWppMjWCynqxek5VP7ahm76HpnorzmP7tiRqcn_DL-L-vIOKOYZ69FH6yHsk23Kmqdvo3JjaFBnlJx2J152U8t-fsnESafXF2bnnuWwvVeVEH58Du9_LL9gU6xbmsiyG0ifSaFyUKJXC_OMtTm7PT7jLiUe_-ax2EHSHqOrFr6hBspPKCDfGaejyn2NNs4d8-JKTDKVRifTc8TjGh5b0jISlthC2grcWfk07tHD6pQ1LrxKyCpmqNebyzRDfazfKb-B2hZqpuX_HnphTc9tjRKGeM6Q3JAIENeUT2m8f5O-F8naVrVgqtOMDAX2EOMkdi0Kqkf4mn_BdbQ5WjwNB4DlYJn4XoRTyMYTFjD_RCUtOHaqoJ5giYQJQ0fnATDxw7jDTZse4LeRLzumSFzaLnW974WsS97HU7JpOB3JpcfcrN27mC8LdA-Zo_1DSaoxQRK8nE9RDfR4Is_VI3XRxJ3xqEijv30S3H4UCGNXsWAKiPvhElnlJn-uxMK_KpMYeNEHxErnbg0mvMNHRqR4w23eowqOqB1AXfk4ndhUQi8e9sd8CX3_bpxiISvSzrpU5cHwULSK3B2wNs0Wx6SdmLn8XQKWAJtiQ0Se3l6fNTxAYEu9S5T8Lx5eUI1rB1SUWibveSrpM80CY6M8Vj6LyNZPBPPYSZ_lfdmYYIWRfKt1rCf9ZVSvHhoAV1Z-aTarvQ_RY-w3cEHI104FLQfnHQWPaQ3Z9BrLUF9iTtGEPBE5nWpjUdeJAhmjsvhU9waHUbMvQJ3GqupeAoJjmWGtuawMnmN5jTwN0KlCoBTdgUiDd5CRIu0H1TMuOItMHpql5yWOd1MAxolC7ayrtgZE2-KAptltWNvUdnQoaibNIFYUqPMYRP2a89p4wpqkKILb4ZxnIrezcOti-1xizavgjSfZU1qb2ctYunAfoTjpNdc2SAnVN2Vw41cga9uW4alMvKYu_y95run2blHKjy9qHULpLJaYpIePXIpaV6rlL7QZEjXRWObJ2nnfkcXC0DIBBIRM0UghlIV4mUh63VgGA42dll_0MH2nG6JXHk_zygDhzpTPFbeYalp2oSERbD4KOh6YNcU9rOToFOIu5NoCF3E2_82VyU3xNyZmGnkWj2l6hlTHxZPdKnzaRrMtaSNV_N9qQrUfcFcbqrXSKMl7Ud7h_SXGQeLIej78uWW4F3LwlOQ5yEWJn0dN7ginvsf1wofPKVXAKH5JvmevGllztWCQf4BbhkmPZ7Vbm5U_Ka6B9fh9f7z2pIGLkf6eWfAKuBoiWdvahe0Gmy7z0SY5aLF6JSPaStf5ezCkJkZ7dkZF0z79R0FAYrhjYkxLafnY7tCeLI-U8tiEJ0hP_NFWkVgqCHM0xSQfhmoQIQZtnIGukOMN9oAa68WP9x4hubE3DtoijPFZYK31Xr8rf9GdbUf5zMVyIAxIFuGt05TfXiDsYxU3Cls8hMxMU3hCszqtiAZz-8IhSYqkqsDIE3mGwcPF2AiG7MbNExZXuBFqguqJHG2wUjeS41MHZLHpehxBkWt0Latp_k8uNu_moDbhnGmEAkEOAREP2DdYY9dmNBYeVBTSAXE0zfDJ34ba7oIY_-z6TI_sgy9LtVV5CJsFzzfNV08v7IDXlvc0Cd7dse26b8nIKEaaBdOFx1g6wvgrmJf3BhDEAW5Yk0HK9ZWS_Df8eQC4SHqdmScx8bSR2it0Wu5f-Xm269Hfnd6VSanrmN0TX80LeFoF51oEMqMXIW8cwWdk43SWghcfV8gpxsknE2JSSPtQjOCfRdE9mDW547Huugob0ZExrdkkJx298qQ-uwNis4G0BfsCmXRSAX1WiPNtgEOLjGthUHCsUK21KhD0aT3Smo_SAJRmEFBzyAmG2uxnAqmcauOaf_wB1Y4cXw5kNfXtDoJ9kI3JPXlCEmc7mkUh8aKSZaXVL3TgGX4J0PgNFdc5fWm5HQNwsA4JEVszARLWfIKG3AV-n0TcHIcV5Q3Nn_Q0i3upj-KIwH0EMt9ijQFBWf8pLYzWdGuiXldObcFqmhBx0YPrZcyB5umRmTqQk-GMLUUnhlrjKFy71rCaWj0_Ipkuz-u2HsqV4bhQgIxtk5xCXsRlwq66S1nZiOI-tDgNN0KiRMWTtD0o29tbYd-ylVG7e0VhcoG5fbY_eenMZT1_z1Oat9jt-6DHwubj92aa_y6ALyBU6AfA8PMYKpp-ehiIeapOLHvYY5urZBoeI_Ha5cWa0KVvqNmMykHqM6IcsozvdDgEfWDdnFqamRw7blGj-iBHphQnirifzRJDr0L7cxz8pLvgqCnu4M83p7aNkowfUisCLKJBsyVymWgbKt86zDHKC7ffTJZsFQBRRHh0NwN0rsTt4lrmvGxuEGNbmXj00mLxDZHG41m5PEHUU8U9kwH7v8Plo44U85CisxhO-z4o-1jQyG6adIUXPnJNOOgBs3etpGMbt4avn1WiZFKXsSNKGWF9KECBx5JLMaW1LTVMMiFaAeWak8PBCEm3tr17kDssdzG5FBfo1CnEkmgzc-w4m5SJndx7RcGZfUY-mD-Wkd2RsPJJZ6Lqf215joZhdlVDJOa1658SP4sh_YrUnoQRgJsJxuALohxP9sqy80ANE1jG0TrTOsHPd0VjKgRsJjlrcMEIdXCo893YNiBPZr4d0cWutwG1xujdsiV70lkHw4KFqfgaqQWDyMW0V9zP86A1B-1P4vuHZhn50XrD-uNVQI4NljKGRiDqAwYbjCaYrG_7jZIWoeTD3-httV6MHor-JRK8OxXF_8JUDCCOdP8EBxRxzo5YLWhc50RJ-wtFMLbmcf_q1nWK7TO8Wv44TTRYgEk6w-F3n12jPVBXXBtfwDH_nnaoKefIw5p3bhmY7gJCJgN0ESX4NDXx09TvbDojXGd6HeNicc_MbWHLbtjtGrQa-SFuyFaevRRQb_4f6XX2W3Xf0Yta-QnBpK-XLauSCxIILhuiZmtyu3bHyVBAGQSaeJ8U4fbGNTOEtWLzqU99DMYruttKouQpetlyyflz50TtES0-DOxy4WAHEJRhZIG3kpfcBNSIGQOgvphi41cl5nhMNycf-4o78VUjaT2ef3ooTXjr6Q6EBLX2QFk3QEKGZHNqdN6oZGq_sdzYx4G-L80EQHadsZI2BZM3-jsWUGWr9WlZN32iT7H9XG7soVPrCktQPIWJJD__EINpyFYC1JcX8q6uxd53pzULnXZGCR_49Nbxfke3bTAXrYHD6QOPrwpy99zp1Nhh4PQQWADFaKmy_GBIVWpXtC2iaNU9UPyBP6hKBiqgcvn3Osqt1PrtMBZIigocEbk5Wg12zOUlXpVW0O5ddYpBIfPEHvZN94PBAwN2hE6GcG8pqU7vwsOUqDunyQ3HCs9tMhFtYKxjrKL8NJdi06T8MRTgB7BaCwKmQnkR1YiLy1p593o_CYqHmqaa1OToeJegcAkHjQjf4h287tmkwWM7lcVbXcnGq7dIJ7hW2p9_2i2zIgMoZPRI4iN6w16Q_5Qw0-MEzfy7SZoLurD9ky44Ie7B6qIggp2PcB1V_E8pdG54ovjUUeRVVg9Lf5cwuFgKTYWuOdkIIJtdR9yCKWfetB7GBi_6Unnj2aNQ90tinivCt1hAQKzCwIlVOhcY9-keHKQXS8A1o3UUm0wcQPKsvWpWcYJzTQDn4zi6AxDppd5WAWMKJO0KhwtI1bV7AWTZN2V5kdwMU6pHQe8CkjwzFqOxf4yKy89TH_WYwMGIpLWrZDxF1byuO4lpL-HiqbYWcKII8isgmYHKeDwwTEjYVATHsmR2Kdqr5eitRB9NamlrGOco5EbO3-dgngtsMBshoH1jvmo8VaxeH1obsFNAXJH3eeDqJHQSV6g_uP-cDaKRuMPZi1wqT_Gq8Q4ITw5ag6RejS6vwE5Ac8V6DQQxiNodhGNZSFEcQ_TXoCkQVhW7KXt1SLe_SmoQPdTZgEdqyX6Ip1tGxjSamvfyTkLm8a_WTxFdxgF6UMGn24fiBw8ywkgTbrBmaRGof5qVYxbKG5NjI-JNX9bfE2JP11p2A3RzoN7zqPRBE1idBKrDUeGP0m6HqVM9N_1SxfGpXrCOw5zBgIscG1TjZYYjWisEjvnetwAnyGE_ctz65eo8hGWIByaaoHf4krnLgkvSCkPBKI7F6XukcXdwbuwpuNIGiMUoSPwUjVq9SxfvoDVJV2GgEt_JDrn1QUF66RyxoZVdpdFgWnDLbbgH3XF_P-G72EM_GercCZ_sKCv-NCWJdL3yCsac1BDLScnGwQKi-Lz7A1PVjbIohm_vaQ81UemoL-_p7jqsyLXW-9-giDWc1yFQTs_I6OmUb62_RSTcsr19ww6z-mMu76cJGKI6BknoSambnuXHHyesV-DWusqAXWqPaDzaRElvRJM6IWWcJocsRn9Q41G7a3qXm-RmPZxkFA_vEfxDuVkgV-Zdeqk3XQUZdkiXpoaTpxhFg-F_NXBRDieXTtbgXWWZ6B23pltlakalPn4j3y39Hiw9weS5Sdi-DdEYHtAVtwBTbviBWA5PBYDAFYDThjh9nv2mezRLkVC89zIE1nEQHvn6e5dO-iUE0HBOdna8clVfhD105FICfL2td3lN-u4r8_HD0UY_DVSeiUCOOWiP6braUH2rdnf5jPoT6eG8qQJiR-CUHFxHOsbDxXCvA8ms0D8ToCq029WszSGt5PU665sMHkUPH3GBKVfMJ00t8JnzY5F4ftj9FJU5jQY4kJ35xGhHT5bFk_POeNqwqEGg75y0P52OfWT4D2ihsqD3API0uG4jhAtiTW7rOHvxz4-Ew-va3w3vNSLmK5ESppzu4jUanZftKBvo2Ffby0YexiffPYkSCRAFyMGUgua-UHrNIXJMqk_MoyG1Iy9zsCsWsfB04QYQjNvFOqH5PdR6Asfe0jDg-AlJBXU2x8GPE382KN8verEMxTs7YOeNXjBAx_9H2H23_P2p72QvyZZAHRpDOzd6NgcJm_nxTKY6PC1uv1HX93_7bf_4__-t_-r__039p5v34p__-n_7pn_75n793KMd_HuZ6_udzG_7LP53b8H_85yI90v_SjmldgstU_9cs3UsC-7_agDWdG1Klev6DbLh-I_g1wzB_dSQwHBP_6TDP12b8q2upYD1fYBhNsjjwadg_chzbuaJiMAxLKDXD1LLNMNYfPI4hGIYpPIZhzOUPKvEHRES5_BwE6g_ePQaxGyaGZzMr85cG82McmWHu_9H_XzycmWH_xodh2JZx9r8_Xxm3_hf5P714f3tl5T-Hl_Hkv53_RVZokP5PSvW_6XMx8z8fQv3XEP8c3L8-EO00aoZMgptCol-Z10_TxR7dZl6dl2GzYyCzkxGZF_72XocYhuHnP7h_x39m5L_rT2BmRv9X5389tEky07-UlFxokvxmGO7RGYbZPcbm0on9a1KWNHDiQmwMj1-6DIHOOHSuePTPUoLvv42CKvkFyyL2SCKnkX_NkUn4Z041LY9inyHKYI74Z47wUEjCJbcsZk7Nkf-czXKV2AuY2kboN3EZROuYU-dk4E8lA5l_3kSKCb93pH_BVPqkg9r050A5P18aWqDFi6P6i1_5mF-61-OmS916S716C__RP3J0OAtJxLQQ_-T3b9jcv-A7UvDFqLLkP2fJEKzOR2c0R7HN0ACyXLn9X_L_8_k_uYwBloYxLY8NVPwYQnvpM3_xJpHoNnHxP7a6kqhZkpZ6tI655Hr-1zgci2Xhc-bfH9sx_y5OKYm39gmnzlH_ez6TsyTjv8-nkIbx_wWfPv7-3sYsnI_3maHKpCFOpyHBnoTwkE3O9xcnl2qtf41F_TXubuEz5Lnywbjj0BisTqA05C-bETZC7xmqeLkkdomHqX_Pw5L-h4wvDVgSPrEjDUcS4l8a0qfVCbfe2f8L5x_K_GMu_8OvxEFI_-Ju_JlrQPeY1-Dv69-T-Vf25p8_c0V4Id2nYYI7kgglHvaXb2oeA2mejAR_55sWR_8j-X893l9z5PzC52Pwl88HEn1lPP6P44B3X3_8zuyNNwlFKEMVP0Po_d-O-a957hY3iYwr-wXQH7sEIb4UPPZaHA2lYTKagzLkCL0X0Z_rHg-ycYD-Nzh8hsB3PgZfjgxX1mH3_8LojSuL2DeJjH9o-7_pW_k4_LlemkL6S__5F336TcPgj39C_45-7I_BlyEP_Dd9VO_u63_T9m9s-5dPEGHw92PFAOOTKQ39x23_Zr77-Fu-IlTWJDT-rX3-4vhXvOiVJnmpf6N7X4mkEzkatOkYdAX_L9wsjv5Hsedvce--_sIcFMHpMPXPNfRXvJT-ip8At5MFW8l_hXHXd9jgV7N_6k3WIh4MFY1HOFK-qWtztdBydk_LjHyyomCLvlfMkhw9sWwUQRU9W3cSK34EaEWvb4P48WgosyoKtu1zHGdDv8NIFkWfCAAEARA1wYLWYWE_OdWjTFKnEYyk6ef7vmtCLe08KWov3P7n10T_E2q8_8k17vNqndi8ahcuv9q5y4923vKDra_swOgLC8vmwj6ymbCvbAbMO0s-8_4Hxn9g_H_BKEuGwQUP4oo0CS3zrtr3Nx_7FWwz7W_45115AHzoACRbUDvInVkhDesGcG02jeW4iuaCeF1EJiaNCK7FYJuGHHQOgtbdQZ2qdaZHMghQdZgRjKCEBMwH_7srsr7UjzhJDDxIPjSudwJ-FSV55R4udVKHB1BafwoYIfR4OIgzZkZbZB_yqB0AwAytgcceQKB1CX4HFyo1XRnSpLoRPk82SZeGk7s6ZnURRYv24yxxHucchuL1iNo-HC-fe8bsNfz1uJFghfRPx8MfO-I0bv6A6yAdlCquKxKkGAt1yOV2K5NY8Of6FFPoSIe5fm3eVXFPO8FDVZVu7K745jYW3YULAPbSIgHIXAP9wi4lud5CrtTYk75HJApRdyrYjWX_FkYPzXodcIzi_yTiZB4mN6c-abSm6YIt2EQJPfnHaZ3T-GJYJRMCC7bLwM4VDtqhgD4Ngzh0g8HkdONNJUmoT_CboBXIjEEb_f3g3Yf6tPRurGdX5sHMrfrMPM9c4njBLCHOhhZFj0hKEIMKbVMaPFg8w9qPF_CNr6k-LhNOMrRTNVLhNFJpdvZ6b-dnP3Lm6rlhQQZa_BARpBZStq2pSLpf7sQbhpGRVxyju6PIct-bM5TgdpLT5gclbRW8G_354zOBZZlD1wYTYDVCgyinTd397j4Xqk54U10aamRiasPmPXxIdNm21ZPdPnIjSxk5FGLVvG8gU_TQkEtr7EoUmuHrZ4ROkk_gBgxeRa4GO8Eo-fwyS2wugGje9K7Bb1pWT5XmmLnNF6tTatPpuYjTZpM0EqYVxNr9kz03M0Im7biT2wcq093GQmH9CiJ47fKRJCHZBG-zY5b7jvegrbCi-JPmi1qTU_oJtXH_XELN-9t6O2DudQAtFuLRZI-6Jn0lNfE-Z2pQMLpYdeqpsZRCyzlhPZbfGRcSxqHyOkuVBBgVyt901jVE3CwbFlzcsvlFw2qs2ozADTuq1t9XAQmn7vXC1Az_iYM-CKOEmCmU8_L8YQAwcHRgDU21fiCBFjT9oVHPxHhXL0QH3Yadq1ZauhM7MgTK3DN22GUFkNu1ed73G8lJmTdcJLwMoPNGEejymt0gxrvyXS-eotnzc-C0OedbJeGpnUV-4N9RYAb85homfxpZZZw68_ISpQwm0RZmFAOvaxZOayVGXGZRrnW2FktlKbW99uO6EbdBj68PdtSJvCaCKIADGkcJ08ZVilcknLC2FJm05kpJw9AUhozFbyWgv8rKSqm4ByMTVEWS3bXIgz7snAURsO81y2UdrHflzGbIMQecQDqnM9kcTQRGzyHJ5sNb-qQlPVVZWOgsjDGhy9efhW3dPZuKSkJqS_Oy4Jruq7MYG7Szae-2B4T3qfJJauR6biZuBO-poEPGtVU5QuLAUYVbcP5EP6vv0dAsHpbhu8FKHK-dW5RRx2JrL5gS3JiI_ijBIjqxRS1Q_NKcNQ9Ncic3fjavuGp9oMcvI5ctoF5TK8zYGf4xFoQy_W_52bYdCA8BCeW6VjbdxoU-9P1rcMHc1e4MPM2D_SmDxhUYJjHr9HL3xjyiMGd0zUl1HQgjXlM3FzTCZ0atKV0PYsSkDkTqRaPfF5ig077I2RXTSkqAboZKc2jeSwMB8-JaRefrBLqBkx4mECon6gyXLdHzsRdkdWmEPV2bc89fct5-jGDWFP_aHOsuCt2KWY1ZWxaWAvqIlmz1Wt0LRvzwqAKaTrnNVA6qyJsdjuPO5vtTBUAAHdAUijv86adeATwzzNr6SUJucVZHMZGA0RWpx6gcR1Gd6rAYcndvWNpPhh7ed-70emfKAg-rSEgQ9UcV9UkiPihGewpLQ3Gf9ylvIeHt6kn9pa-lIbQLO366mZn0DtAAMg39LyRRfYjumOVxIsZoyypy0S_nwidE8hIv2wge7pWk-Wa4aegxIoBHayXKses1FnejOxBX7lar18eoIPY2b9R7X6qpUc1fDL_3qwFxOT6pamowmZ925SfgXn3XUDwZ7PyIEwf2sZcjeofiZDBO2GFe4bWC1csWh1USweuK4lpdZC4zXJ-tIHMX4RQpRnVACUtsUQSuAIdu2YmkeTQ2W1PiVqD2YSQQ0dfnSaccT_i10AfznpTGv19qA2e9evHqPzzB-nYFbRYwOVzpqeuulKK-aCWDkvYntMs1f17FyDuYj87a9tJN9rrwusuMyTT_Ms9uGsy-NRMiJGztrdfazcwtjffDMX2vaEcnvKZRE9alIiadAjh-7L0ai1WGLvIqxVRV4j6XuDTZvAx3Uaj-8g56kJOV8qgnfyVJZtZmTTJ3WjZb2SoSv8hYVT9L5CEvahsw8ca0KmWu6xfVQPQJUJmUf4UGT597D3xX59U1J3I8QR7H9p0b9wM39hjGhrW43_RMlWtqNfrduxh3Ru_Pjl1mUNH-9XyXASw_FsJhNqU6SQSwgQ1NdJ6E4Cr5QZzdyKqNvQFji8Ar47IbmPxbK7oMzJJ0ocACWqtC8R8e_WK7qqYTICkuSo4jvY6fgxyTmmmF3XyoQP9Og-8JDg2kZK3ahL_CTNg-5s9Sqy7ipMwNFGipx7Dtp2GGgJ0bfrjwy-hgydq12RhihVjODkWZeNTmkdjlERbfTWkrlxJMT5lnNhqp0WaL2Ifftd2EeU3zLegq6f0YdpiTBs6Gy4KxFEUPOPxFkzbR6HlBilNrAUYIG9SqGUR5zVdbO-hbDpZDvHGhJEkOVgXSGp3iFEl7qzCg9DrHenPlrsSD1YQ90Yo1d0X_5uz1QQGXcNayUruJjdX_AWxjao4xwAcsUPqD2F8qUNKP6h3WJqyFadWbZ6d62QVmZCjcFBemUZm8ifjUdu_blRWvaXE7LbRha6Y6FLxOyCvtbZxIyEAsFvzE5fjSYxyyj89tiVf4aKEyA0a8MgoQ1JusSiCh_H84Omtsy2EoCC7IgZlCMzM7MzM_4-rn_NmCAklX3aoys4PKC-fKdgjo2_u2QAzDeOxNbm8D34RErRCkg18FZgBpf8jcj7IZLL0ZNUJ6rY7mNcBYoLCfF4x1FprXAkSfCEz5u1-zYJ_7Qcniyk7a-hEvl8AdsG9dOhsVrxkroTz-X9KbPhI3PM7Ya82v1lba2-pHPQG3EQ4ndu44fbBFJ5z-9SQk_5HS_KMf1hw23l6BdKiIQWnZNJp_gWTw1qIkPOE8BbsQVHbZtt_zOGw4MwRRRo3yDNe_KHOBdrgLIr7DO0gYxQjLxJraWWFvxg1cZt5BtJApIldk_vlW0Gsgq5BSeblFhE6dJEnvKvoaQA0s0xWRavw8WieBor-lC20-VRLZYPaCgnFP1C9TUuCThUI2GV6bCc-IOmttBWDc6XwLNzRKmBeDlAQFUv_XHa3XSoWpLRXXSGLID4Gp8ilusrsTeWQAuQwjOHtrv81PicY7ZNJWy-cYIzmVcTiDV7RYdUgA4BRXbDvaNo2AH1IuKb29dCzgm1j4xg1OUiQg9UEA0kW6Mo8mcl-jQoQG3gyxS3R7ck05owtAb0_tO_IlgWDwAi6Z2HEJts6C6X6IZhUmqkkZbTiwOs4rifbmD06OqNfBYSFPKTby1Hku5f3dGgNPC3TJhwruFfnclAJjjH8y3RFysxGSZrtbIIz5G29CsPkNbS-pmLcQ3yU_xpCwUH-vk-vAWuF60ECtMveTzDbwHkfgl_YmK3TbNDyoKfTpqLcQPTkRHgbmb0BVkt9wk1CdvMQ8h98caZPNHIvTc9obQTMkMJktmpb650C8oTHo2zTc1LFWeAkBiJp7WBwA6LOceRUxXewPrr2fd9yH2_7-IroAaE2jq09160igomnaf3lyfGa2HyQjMukL2yI7bvi0NLIYjtoYISFDVdkcFgG1GfrbF-mDWyyWIur3yzh6fjGYRFAcAZ_8_jWulFt2B2e_71llLuoIYeEGshGuIXPK5W3tvBV8HCfJkwAvA4nnR_SQUq7g51d8ZS0PKwi4Try4HJSZnOECqMjsC-VHK01MGKxur-h7_gaygUR0Yge_joW2xmJIS2gdiNknrcZ6QrQLM3-9DdWNZog423J8U6cwj8ZHs_gsTcBRqqTkIDQaqzFHKad1FMsMWJxI6sRwKtZUyesVbNUtjYQxOhc7A9kcMu9wM8vermlsps430GlPk5qXZW314w_GgOKoPx7eqACxMa0MucSJseOmF9RDLbytWrifYV_Pfmr6W-8U5y-NUhxqQdiU9FMy1AQKNYqfNEOV4DSdseUyAUU7BHA_g0r0eJsrnmqH91ePARXk04kTCpkPkopPLf8crMw20xxVJoLjt448aAphV5OaDch_KDibUARu2bgQyBdv8O0-QCB_ECAHCVPNULyy9VtFxypuamFvpcu4wTpAAQCzT8f1koC9WlFNp1CkZcGlQe8kCWd536Uon0DIjRpgasYooVYpoHU3PMwPB9Yoa7LqbwsjJS4yz_1Jqu2TU8Q3Z0zTuhbAc-hjZ1uDeadbicQwoRP3w8F9r6HAptafW4sxuD7dIaPtr2bc4O1rV7wMerGZ-BzUZLqmAnnhMf0c6Qbr4eWRchIfLxtQvDbexFZ6yxnkVqERnaPcAK-bghCIJXZzkaW4Cyk1BTQC0DySMm6ttqqEOwMpAjC-ufTCgVdL5xReP_jX6wBGkDt5vrrcc9SmCJ7MxhCdCazSjexFo5ioggHoUtigf8YBujAKrwEixS0dIaWcG9kYKqG2AjMz2M-EmvR3_vLo3iQsJydAe6NoeV3Ngdg0FTMKPSyu7mapl-386aH2Yg2OBNQu18JUNhQViZgP_qQt7XwbaXQN8WL98RWne4PFJ5aRKCT_HXlbXOTCfrycXTQmnzjo7ZpButk6pTaBA3lKGhhPFhLHY93Yt1exQIYObBtB4x2ddWFz2mDrfesIPkkEw7erZCWNtLcofxdGJJ5iXKOig5bDblUzSfwMZ0ZxcXRlct441SpDFNSOb0TG4MmQdL6-a-OH635iGIdHhb1BRhYpGb8lqfgRSd0UUdkoZ0IG47oxTSM_bFIFWg7APChu_QtQwCHXDMEqmxTJECmPZw1DFFcUK3CowU4_sTlH0rboMUkaTo1pIqKu1m-O4XIHsls_zSu63meF-9SDsl0NtN-dcViamfU2bnaYzgjAHmGZFrgVJWi1HpnFRFHTsI28IQgeDTbyW_N_XK-m8-xH3IIlzeX4kiQAUthIdpqNxp3MaLcwxuKyVyPIN8uxWXPLR5y7-tnNMPUZWY0goMRLNOzWRMbSGNGu3xuynA20naFzA3z8BOVWbrY1cCiBj6Vtaoe6ucVMkkItvRLtK7o3eUbJDJ9KcgmOW-qAkaMXf9Hxi-P5t84lSczGJIPfrZwRGFTUO6UOEBmHLOH-_G4JutYOcY4mrnsDvyzcliYLWUtsR4DH1F9zlqDeZtdUbLO93gRWkpHHj6zgViTqdzmiM1Fcj9fXiUsfZ25UrId6N12NWwjoTGKUMPT6wnB1NbmZw3Iajk2thBWjkYeo4oM5POCc4DZl3-M77uA4hwDMWiGr2veZy3JXh23GTacDnsBdhpj7TGEHbJuE9owsCJGy5RaQzo76a2WmpmWnhwIgisNY8TywUdm-1ZXInHSiuMThCjFTKlz2MKq7xxmRk_PcS1J9kbmnYYAGDhBWHhw1xv2bst9l6FG38NncdV2GlbHPd0I2cf3Q0KG9NAyjT5CYRR4K4JDv28Gvom6gwuD2jtX3ClhxPScRDfoNbBer1ax3JFFwhSntXagQ9wa9XncyBRSqunCEtKe5sXV7Bi7d2tiIy0J9zgi_cEumHAp1Z01V5shJEJbNzxja4389Y7MgI_JuxLBq3BCSO8vy_tzdspLMbMggAxTiyEh0yxpd-dMZooz2SbNKVemYpU-YNlO2PlKArmW5lepb2f_tgsd1U9rI_JCltr2Txfwlr4S7NRqqofLcBNPYKoQrHBv5ov3yZsbl4-3g1AddToYQsMOGj3MUSc32hRuYvRXSgnbHifF7qGGg5e2GtAWJxt_0O5CULkFDrVAi_SPEGsnN3LRdrk7e7GTLx7YsC2EF2yVO3tWV4QAJnUO67swOQ-lbU4dUzfTOJjEltxd0Bg87Fv2lSNkZLvowGcVC9Wc0FoFsLdYfaYy52STRmWXEDqKMdAgquiBZXgEWZQXBtFahdZX3ApMwu7cZWwfXlbWZUVBwV0grmpczpsOyWaYNwuCb1MRp2axRVKEgPL4Kpc3D6EjNbpZi_pr1WCKuoGEGt5psK0KC9v7acKZYpKYLVAviCy3IgCMYAB_tIoAzTmpoLW4iBgTdGwesM48Dnp0EeFNRvih0OiDICm5dCWRLgYFssm8RPo1DoIrHT3MeeqK4mNAwg2lnf2t4lFj12Rce_kAvoOhs-iPeHMKWPA4lm3fris5mMY0jasBPTEBQCESuF0OAEfpDUmvluPtPC2At-Rpl3BLVNcbDcigltjf50dhcVvDvcx5XcRnjIObb0-QrieO87wj8WBz9NHLDG3ObH9RG5PsETrhY8jFO4cmV5SWdXhznt5h347AE0Eumlb1y32Isg3-dx7RuuN4M18ItELWXgH0M9-usnA4_-oe2YKZFvjL7BSBqkaVhzS8w6GL2LC67pDZ6vkw3k8DBSEzUupbnFilvxKcM0eNs3L6xprgVpT7xUmszUTXdrvJGNvC3gtkZ0ZmYuJ3B5sQQT0kewwxDrevBBU6XB7H64TMxI_zQd1Qp1HYiBRUDPmSYDdiGIUrhMpbDTKU7cd1StMVDV67SqMOhMp5zN4pr-fVUTOixOqLaACVIPWHOBqpvH4FUdku1E6x0aJ1blgrfoyquyY1f3tCwQivH3HOBDUYBge-waErpy63Oy8SIPq6E3a87uoG48AyiS42KiQ1T4VkjOPdkrqxx-VX-VDfPgz36lf75gyY77i34kvPpt7Ej33i9xEQ-5TErIJTO00yIcohYUq-ExfoPGDJNIgTPy0x0KkXrCXVvRWB6NqZxYSG0q7DIyP01EGUscN_NDK7qmBcLsWUQnwINSA8Egndx9dM7sRTo3CAMb97LplcXtE-wz334o880r1PWXI2BC1Rm2Uah6lBCZM7s6GQ56VEK4J3H8ZokcnhFkewbatcMMtzIOhON2WGRK1DyvLskGY2AZEIJbn7wx-WsxrmoKB6sw1YsilUZNuGxJ5lsAdlmRtRTJ4NKGs7ogStMkqSpP3kDUOxPlH9Y33XnJki_8RYQv8VN7l6gYWwW7ZEGZVHnTt4MAxuWnmssJq3pRcMexhwBOITIQ5iAVadmQw_I4ST_-PfVNFQXs9Pmhjj4nppnX-25SVxMjjjkcahE2oHK1_3GIvuI_AaPBJE7d0sMTZ5JqSYlBde43wA9Ex591O-cWE1K3ghxyUXErnwbkO2Iz30sbBupVYocwyg-RFn2sziHWggjjizoHcTvYPxwfAL62XZ9Or8j_naKU-bjKmbR9Jfc53wI7YW4--0eWhCC8cOOzFNYROAA5bCpJklKtoi5iDl7zpppqlg5npsxz7E7NTuCwvkIH7cX1mHZGblbX__7RNURjREC8dixBtingDpzhgUc3bwiAqiYLHh3f_vNeEeneK2tJIfnV7ofybImICguVMxOgxZKMDPEy9_PNx0CGX21ZvVId98_UHDJ3SkrC8LcDXADzvqKcBYkwqbwyX5qlF7RlALci1-oE_ntvsAj3kYHKE5NDJ7SHdLQdpitGVpt2G8E0IUwGNlPc2mqv3M8rqOnrHhsA711yUPYU3dSWMku8na7UQuJps1LpU_-Ij0tJtHkJHnej2ERz0YVO9jdJecrc1kFCIyoTxABTSXn2UFzU90boHiGvZk86G-RRzRESUykK6iUozNbnRlgbu1B2H596CvvM3mOsQh3FvGz4fyQg3G2SJj9INCbJxCndcb1JyPOAm1ZbFqVf0cJK5s4CZxadKF7CZkrv9TDILJjCWMovNp7T6SCydbrZC03IZATDm1D4CwXion9UwcebrS3a6lgvDe14uDqBipR7RLOzQwHVRrOahk0JOxaTcU5UUc2YeOglFhd09xitgWsCpKQRIiBlTEKRzg6Gd0NAu_pbiex4jemQtGwWlKJGOokLEH8pzPHDiodXOekJVu2Q2w4qssmqOMiGiG_A0vTNTJPZUWKupemrio_3usUoUeXdJbNjiuFRpdPrNirRTVKJ6mYBT6QWstOH8Ap5CjY4JP7QGNzU6riC1NYXPtdw1XXFUZabfEDO2rna4utHrK0xzpQUqYgZluOqUyb7BMtcsPeBfl9FXrRfDD4DaMM1Eowfr6lupz3MAYCiNbooUPg8M0JDGiD5KAHmabPi7OsMncXynz7GCFdiQ6gqHxnfLMQpZrUnCN1wtwgsAyrObm3WtQhAD3Eat_6wKkURxH1KaU2x_6qo7XCjGsrynl_-6sqWGO_O1JNgwpD720TOcBEe53tciNYO2pelKwznkaytGZZxeWYHOeOAHhFn-T3tSfGdpS8l-tPTtmDAPebPeVNtQYvNyGx65zMRu2p5-BfARHnL3eBRUfgskqXX4iJDina0o0NgoBD91TxFSenRfM6C-eIQQnHn0FmxToWVaRTUD-Apy0o1zEp5r2DjUYwuDN_sIrNu53_lkgFsGaVQ4rOKXrADbg4LgIZrwzKuZ_WlLNZTc0HGlkZnDpCP8mWgLDlDwLaDvJHGUFGyoL8KFJjj9Mvun_kN7Vef4d1pMpoQi6Y_MIMA4ifOC0s5ytPrNikp5uFRK065yne0TOr0DoYt_Pt0Uoc5zQh1sJsGn5YxibtJrHKrRdCjKvVff34WYy0vdalXbIALQioNC3FjuAFkwnlHpsEUUqDlmFyokcWJmJWSmERq-kMRpVk7IMFpko2bikRM-thXzfuSgI_Ks5BAlVPP8QqFhwoQlDIS0A4jKcshzZuWycD_MxRFGhWpOTx61SS0mNgk8s_ert0NEgVW0kMakUsz2Z8h4N8ONrHMZXYkcZiFP2Gsk-Y6Jd-A22vi2yx82kfDZmiOn2190u9Fdl2JBjzNkV2sCBMyrKSOUDD845RKADfmPOtMuN4wQCwZ3T_UF5jE1QBUaAHSVpFOry2n8jhExFPPSPTJLHzLKfOvH281Yn1S-KexYhvAgzomcILlfXaoJBhmiz2IWdsKv12VaoJoCoS6i02VPQC4Rd4c_r-0nmCxZ7JhIDx7mJn1BDDpYg1infrZpzeZggaFly09iqLZWO8wcULu5H3mN_7nhnFiWZZHrE0GCK2XtbJKzAO46QX0QTqeZBK4erNYIC4XLtw10IQIu-2FqWREfV-9etpSP0IIuC3kuePgmJl3CqFYEpH5CxgVEEX61VvKTdbIb_QB24lzapXrHc9heSFX-YYpjdaYq6JFQdfMWNpYcCfa97qCNQ57OalkF8XFFxqS3RrLFdK_QxtIzJXkciH_So6q4WfFkiDYqik4LLWn7CYvUP-ddXXfdWcKv_KOmfG8_v-Ee5-0WCHJG7rcDtzAgVrsOLzPbqPHeak3-9DS_I6CzxwWLvCgEnHiDKDOpnd7b-z1YyEbMLxgo5zYxm_TgX0SCW3C8Zcdh3FwH4H3IvpKT_nXfcf6aBzzIE_AUXBqD8lFEfljmtXmVKYiMosv10X5rG6BpgMA2qnoPA4pJl8RwxP-LYMZZvgNHx4xvpO9obDDVB909lRLNCKwiF1AQvjXTr_T1hiCaLmVdc2w4FlhZhyWNQ3Rl8UL9LUC1-o74ZOP9ZPAzw-6gp5SWVk3zpxMUNLoUd2lh1AEv7qgLE_FaFlWd9Kdzbn75ofMsRTEvTkDOKTmAVD5bKognd4DyYRpzGJOl0JkXXWWkkL90k1XVRQjemCH5ajwEy85AeStVtXyRf94DvTjgOo_QLyBKIyDKa4P4r7_XHb77iXI_7W50PrWNuXZGhsjkczuF39npBK7Am5dEqXpMX-BM9oncV4gvnrE-lajRxI2m-rVNCLSNpMzd-V1_EkzPKnoNZlWUPc472dYbwBy3oHQqJgMYI_3Lwg_MheMEXOK5ZmfaRFgNjV5HyVeQZd1Hym9H7hq4pouf1qkUNokZRriUhpBKKPA4wwIy7oHJhCiQk-Fccrgk4Yf9vdo65_5lKewrebfSZUQu-S6rqomjB0bjFa3jj5-voKGHcyA_MR6vJN_kkz28ienI06FAjlFfICJ3BEVTvJ0Hj9dh4h9moGi8jahtOXld0JAqQNncp1C85v5Snvd41rFp3XMZ1jbOz1DCFkFKb4thbmTxQh5FJP0u-AI3depN5ZMO40uaR1ZMU5p9wmbjyVTexxu55ZMGtYQnX_tZ9-oDZHpzuoKNd1fHz8BjKKUpjE1BCgepz3w4yM8hlLaRTA3RAOS9eYUxdEuce4zn3tIaAIoAnIxKl7tHsDossMQMkflPiE6fmKf-VdDERFEU4RN3tq4tLVyt8sAVlvBwCKOiirrByd3tjyzIrtpty_ue15gNJzA4Eutrht-CSLLpIAvqkpXiCkRjhVPa2vk2ibypzBm7-K_NlOAxsl_aE1Xk0URKNEQJSGphXcBF5C73CZ1jWlEpOm93gLxU-T158Lp5xVPCJcIGKqmdq_c8H3sg_5etwKrl9Q15PpvcMri5ynDn7W9OmWBOczwP0CgYlXRU2Fa5pYzn1GN2owc44TNnbUne9MIq0ZlOSf9QB1humuxLPanHpv44KCjOAMg6pv5LeFZ2AnOa7cNJEYIibhgWCIjy4L4IN5PSJZ42hjC9XZx4LVzfLxe-MCCTKhMMVFTwYjbglUSvw7Ipf9Wdld5elJvH01CsKIswoU3hCfx6yW-WrvLRl3oRSbE-2UaF0sNkW5ZKUDFOOJuvlxGmyFyl9ugGkF1usstelpOTtWpy7oxU-YEvX2wn4_A5KiqKpOB6nLms7A7nBpKhtFQVjmCUJUo87gQQmXP8qHrlVhFL1iytLKxB0kEVIIvubewTSJN-ohoYeKXwQFPs0vcFOcfKy2HQB8Mn2EswBzoQqzp9OF4xyqNUSbaVHtGMmOSZ7B63T5Eco_opWBLwnn5aNAdJ5O9BPKRPBk4OFIS2YvKDnKgkOrBrKdLOCUyW30RS-s4zR50ih9Cyn5YIfVn5-ll5naTobgXGTTUwZ7MHr8JnuyGUMAn3S2GqmH5UnrZYagdaKOFeAjKI6hSiHTlyMjZlZzZD3GbwlFX0S9VjzHFaJb1T1Aca7005ksrMIY9cvtDLWyYxkDdNT3FF93C4PKKdmI-vT_56Z8RZLMSYAo1VYtRWeCJDPubOhUU2c2ulg-nmHEMGzeE-GkYDOtprDIMe8UYKHCfrzQgCgrUJTO1fxtKor6NWlbWwsGJsEOXWER9VYY613b6dvhbhJY36eO1YjF-j50c_OADioORu1sUyr-um18RPUZEGO7McVcdl14XZoV1kl8_JAjM-xpQmN-AVs6aFxxdatnZH9uAQ99X1mp4kbWxmIftyX8rLY-L4oB-xPP2yQHib2bqGa6_a89-XqfT6NwJV1o-_MbfpWYGYB7q9IqVbe3tErcaXVEAAvzrjFHbpvoSKB8Zgq8VR8M3m8x-lzinfp56XqCI2jO1hwNOtXarljTTgRwRg1fjeKnvweyGcqi8Qt2WIJqCW2O49T_uVme7HwSbnOTs6xFdIMHCjRhWlr76JpSDc3mAIoyY35JEx1vcE-6Wqq-eSI1W_X-4IJcj_1942ncWnP_4CEATk2yto3wrEKiDcc2-unpUXyA8Hk3pz5bTq6h1lmNRjlY14lUIb4fztfVJVWC-k9TibFWFoW6gmQzYyAyKdyivryhsFFJVOpvM0NcgG75mJ9eKGRGKNfaWLJH0BLxlqWqjbODzT0wHHri4L87YlGE3VllDfvExWi4yqv5t8LaHLYgwLCRhy-009v2sdkLb-ku1UAdk1SKPaaePIHYQxHFg5-d-uzgtNviAKNV8cvcJ88sMZT-DHW6Jd_m75kAt2Ecbi1oNH6mraMllhJhIpYKdsTWBKOANTBo22CY5VMCdcjTwmXgROwmLfINFeK7A3Y9tp9VbMUuSpSfuJRWkn-_vSHFHbHD-c6YxB2kO29cjOnZPsgW9mtDkTDfpSIcNLgnnsiIQQDE-WSWRJL2upKPmJ4BDc2-5QbzN8PKP-NRimxrwLFKfnK2f3MKr2yDhguv7xCA9uENIjMD12CHotZNp4Qal4AJoe7aCpWI6V56OhJUesUaf1l2n2vZRb-iFjC98EHxB8FNCTd5bWrtt5K0PQH1Qn_T1cm8e8fRzc1ipHIr2vP7cF2RgCoE2bgGn_D1Tc3720_EnkTIr49wpzkG3eiK0SR_DKvzGRtw3iQKM2ewqNxLGjs7-vsGfQAmhNykEhLfC7t794fij5jKH_b7QF0CYINdmPwCD5UGU00bqi4MOFmGuab2i1Nm6yTzLZUdGs7i81zFXCNo1ZXtIEUPwaYBORUFByUrM2PpfSbfJ3YOXlQ55jvGRYa9kkLhujnvJCOzGXs11wEQsfU4Zb9b4S-Lc1u0DNCpXEXIl57nmGIMZHms3PPqnMafBF_G1a6dtXnUC3475ZyjQIy9jO5aZsiYWGPtbs3nSDbMcJie2-_JMzG7wOWIGcCsfPN6VInHrPz6BQUV9e27NnotfQF_ImwOwBw_dXJOLKoXLPS4qV-COvJyhC9Kd1w0E8_JEpHJXASohoUNjnk2BQY4zw8aH2VR4RDZcmiavJU8X6xyo6NMqTq4AJ5K_Zoz9aRdUyg3eTD--2QcuJOqZFyG7VmdwzzCZBlPxQ6gklChW0Lh5vlFCiRMcLJF_45GzHtMagXwD6oHJIrcP-4Po0VAvhsBlC96_HmDImFhwiKcMvAQ3YJ4MlEs0rArEEa3eou_l1IHkEU9mBm_HGDFWaG_72BVriAqyO7cr0LV4wBZCfUDGzss4Pk-Eb30NwHuLyZB5tuB1qbxncbho2MSuX9x1XJFkrzBwtOkngx8o4JbywsdUMdvQBBYIx3nR8u5hDK26sdmivKL5QBpbHMow-VQssTuACRasbruabYi2jDkkTKBtX1uMxUmV4lKSSbiKOKe1yKpNcGQaIyB504uQ_xPGM4naMytcXfFmgl7wg1SgP695b4N7CQvqGV_cuOCsPnAqKdnY5nMYWKT9OJvooeRaAitevwaLJf1M5bhfMEYwppKdzcZiT-F6tw-hJQpAX81jsJO6r5nHOkD6Bfnv2dImrWScBsHaYwqYDbFjtUAJKdyXkQ-67fSSpVbgUAmPI64N4-WBCY6MsaDDGfFcD1j20XJyyOOOXl9l4iptCZwsC4XSZ47fotoUF5lBQ96AQRUa78D5PTrCk46T04fIKGLXA-4loAHQDLSUb0bpJBVdE4jW_wm8EfzFzlK7gYjZ3t-k75HssgsgSteWgaf-m1Ke_NdpSX3c1O8eqvzFRhJUUCo6cYAEGn1JNShi3IlmFiEdZ1XIFbAk79PXFlK50o4dhQWK2qjo75h6HQFVrAyeuC45zh5bNUcBgYuAS72yQEA2WWF6JKA_XG5KedF23vCbd6iOxV1Z6dQPSbn9SHNlQyiLTkIVdBvxK4l9zxU7qdtxgoZr4Z4OvjTpAQEsKDA7TerdRx2GTMBNQgTx_yFOeO6_hgGfFxCUnJ0foQ4fzk_SBk80WWfYAdkWRpwf-6LQ_rOGaF9_fGj7HghzXD0j2lAmfjAT9Dn8X7ZrFGpUuYVOchQvtgNF_TaRDKdsLYLeWGVXGCPC4FAGp8jBCNdknzImrZ4spmCswfn5fxOzZW5H2_Vt2u4r-rwbCC4eqFwWngrnJjFKk-0kRvgn3arPQuckvcX7O5B5tqdelUni8SGVTXijKZtUban__WmxdioeNrYgsb3tqV_CBkOpcIjdL2330n05wtjo-4-mLgdMGzCtMVgobw576XJ-1Ks5Pq4NoGUwXseCFgi7jMfF55ZdT2T0aOWydFDb62vJECSTlEw_tnNT1yTlhU6b6mMRJdRynOmFP-ocEh5xk4TuzAOlorHUehOgakN81JXjiboL8eOeAGkMxw2cIBBlpO2QhbklwaU6pVl_QP8_cfLcMOsMzQEc_FqVeusjiUm6vmsrNG07fF4HEoCQnsCL_2gVt3hME0S_A_Gcx7Bas4RmQ5bYrDrq0txoQZeIqAoETgCPiLHEWN9sNACexMl-dEFni0CTEq2pL2WOaHsUjUpud5CdM_ZiFfd1A3eFKdC8ZFbcsM5TFFWh6USobQ4658YV-Etp3lvIm6Cz5wRNDhJ0RYDZ7_3FPKGjlicADFf_MkEJPECfZN2PJyNbARwwkRCIUWQL3msPkqda0nnrEU6BpugzEdsXVZ3hoqxaN6YNaK-AzPFAGIX2_e0E12g8VmATKLd3msPSjtV8jRVeDxHkhg329_pfkHeEYxb0PVDIxt44vQP4tWMbTq9cnKMpgosVjCt-ylKtkk6BQo0Yp81BTuR80NlTf2k5WMvgBnLrjnGQFkXySuD1WiajPeXj4k2oVpC5089s1hk6xdSBOAoypOJ_J3RTajp7MKI-oBWeU1OKqbwQEXqCFuqLuDPwuyrbLs5UXbwRhDpapU0Nvi5MXOIn5N0CpgGeZlNsQRHlLMMruGsu1vdnRVe4eX7vCZGwg-jBi3SvU1m8OsDA6L7iHljh41hw9hg4UN5_amC3NTU2cLeq_cZJgRBUgW-YuV-clqmVSfgHmj-8grMo0OVb1JUUoCastt9pQj4dUPsCfMW8oYyUddAOd6CjkoFuDW7374Qk1CfpUcm46WSNcyEBFuZzS70-UODYNl32YPhJ9e976qjSc1VdZKBhNBimqkccqaQpMLBdlH7iCyV8QeGMxDPFZ7bdC4UcDjnsDekRruZVnpZqDgTG8Bn8pEnLuFmuKNszbKjBrq8-JI41uIkHcbhAz5zu6IgwiuGFIkLAF42ltLHw-OZg9tFEQiL055-YgvSDKG8RLGoa0at3RMoaEw7Bdd4oZEO1nXO72E_74R91SufUglsG34iAQfT0M370XWzFeKhCEgrsmPrKqzZoWfL-aq_G1fuPg0hbvGrEa90O2yjJ6SvaXELba5e2y6Uesqy_swhAZ3A9Q7Lsj-xgnGSqMsT3pImZ4Uo0lsHCKszDsG0-N2V_1JxdJAdPZ3HZOzVMMvthU31-tP0Yw59WfgJQRRGdrcZ_ZgA8BX5LAL21h265LcZqpZdC83Nfntj9zU53wMfp6eEI18QUFYKstPyfJoEgdGoGA8OniU37Du6iidw28YZnPd4o4GwugtDjGYIHcixTPWND11fgAnlMm9Gf4InlNZlIa2UhIzAxqXj070wzQdYBnl5G7szSnwY3F0ODvj5D6e3aWTAEWnvvd391OdpYnB3xzifTAfsVs_Y7JtCwtkqtcWH8Ru-1a1RJ20fDDSHb8JGgM1Ejq-qaeEjdwIoRZyGcc9Ebk3Bf0us9eiOhYqnMfdP-kn3poNLG2AZa4-Kp8cKU0T61mZflD0tdSyFoUzBk2yGH3aZoGn3l0QuLRQ66cTSo4fHXrLY0PBEhgVTrNngcjz5Gb4IBO6vxZbxbTR144mr17-apkABRHyEJCrpUyMHluvObfI6cdLzjF4PC-_qhvqLZ2doaTZvCq8OgB7ej6Trst-ttC4ZcfkSRaWiZFpnajH8lm5qN3kIYTYIcWhm1mrY0oCAbtUnwuHDuaVuX0alz2IUTxUS6Jl4hiCKbLF_vTmJrrpJ3LXdru7KfM-qPsRrnPOgz01cUqRLu4vT4FdaXUwAJBqQNH2FCGIpFoI9fse0Ii6vnSJsya1pXYdPDkn32cFkb709nY_PfrpSBBmECNjRQAaAOGqGCCZi-u4CZDrzib5tMzn0uDOPuHL4uBNCczGiqsrITPk0ckrucpOdLBE2HF7wmrOQHxONBqZD7mSVhLIW-vMsuHx0T5_87CgN548EcSD4xb0c28AcTRH3SYB-v9M24CKyxFM3iY0MvV1lMmGyZELhos2u4VyfUriRSjGVvNP1s80J06ZzCH0GYdAbKGkUOOTwMvBa2U9VkAo0KdjOxIveZtAVA1V7FO8jz3lonuw7ymrsxnvD-HrQxHv_a7OocxeFtU-Ko4HF_6q8bRrGXQMpDl5PAIqgQ9kiKdjTWQADISzNaxw-f55YyK2fkJsLmflZUaSKyStoHqwovrIAmmXhuYKcl_x0sdB4OwyffgG415C1HvLp5gIBaDgB5ASAVyS_e7ZP3lHzRLWI6EP8RxmEBZsHhpMcpViU-pcO7rPKswMHXaamW8pPHeaFpCzm36eZ35B4zbIaiKJA5ytxRqVrsjOqRT7VkAApNSvkVgPyPb2SO46ocAzL9u-ihiCij130GvCbnVDmcAxuGCOY23JkCcNZNfeWdAsCequ5i155a_s8O4AuFLB3a2CavW8Ojd6n1zsn6JM62L2HT2WqDE7vW9ZIW-mNIzaUaGsrVJtCa2I6aK1KpbamwBlSS46MhqOZQVnBKSxzHSwa2ETBBMYPe9qSCwtI3HHHsYRZkzZQNJ2C8xYrDeYDbCT0SAALwukEP0Dwr3lVI6QSCBksbFknmfFAxUP8kuItGNUEDqu-53M9QegzWOvCfycq6XFtLaMn9UkTgbi7f_KSX4liJ5vb3kSBf-04FNBmSBTz13hU9OyGRWNRT5vae21zQXNQFj8ce4GVs19k9Px5w9RysinTuRWbajr2BpQ2qTomNhxXNpscRKSM1kURwdOVoHkPw9lq63VN-0Wd7T80LEW9iK2iGT9Fhn-TnUVuIrA4tyua-HKwZFHbmigMDm6-7QNrIf3AzyZVsgT9rAaZixpQ27FWJ2NopKa5H7pTwacPbTfnETujp1dN3FTym2-Iab75VTREAuM0x91oXAy7ltemeFycAt9pkzT3iBqkSybcpZFQjqMessKMFou-DNMnNzPSvQ5RniEarQYFsVz0ycykNdzTu8zj9Pn4NBqilyV2wNdiuW7qk9swer-YZFiZoi9wzMmRs-3mEOZSIFnT5WHbl1JEZL7X_PVeIaDnpXDMRh4nfQj8RJuvW1euvVZeJWYLlWaRBFU7uZYbf8bjE1uoqQg6SlPFkq8J9Q1j-W8rwGF1aFNpcmQ3lFUOCzQX8SLqCFka-clTfHk7z3orVzGQAjCSyLmEmvTEHSFy6WPK0EKBaYwFo2ON_z3TsqbRJcog1OOhZGUqxs-y8sxrzKr6fRN6BRBTx1BRSjeq9wFzitF-gySYi5eer3nf5Thr7pPi5tKENdmKr8iY9IcSNMPGZZXsqGzJV4Pqih3n6VQx9hBJJkvMRti2F2Tpo9xjXuTdg2pxuwVQny2_3DoyG83AXROXBq5yxEWTNbE4IhZQ_z4q7K8fW__k-ENn77o4sa5TxYdFCciBshNsWmmw5wvguVjtBJRz665_y1vUmVHQ2M2SMFEBCVoeW3kAaAgh_RKqOedx8MKUWLs_StBVise-khL4v4rr3VsHbVZUv86479rg0T8wzRdrGOxgGKvd2aqXaRC9V77AS_oqnFwx7NKU1pFyU_Ts-_qVYxzXBfgAH4FahN50EfKsWM7UXv0AE9XIwpj7pXLvQqvzmuKpr7JtZBIeSaQeyWDD7nNWLtlhImDLq3D7L-hYK5MwNFLZLULydWFJv3GjOu6aAqFVdQAgndWhS9814BOOxwn7jf5k8Fx7vydD2Y8btM_HNXIdfFIggZjjMLWzPUo5MJO8GzqIaVQQew1DGNVDXxL38Qfve9xoJZgUd5bylmAXbKCUqh_1A070yvcCneUJlvNVX294gQqaBAjHKLyjIKSseA_AtMeyZ225a548O2ESzu2rK1Esm1H5sWtpi6s8STcUI-hTXkUYXu4u72Qwrm9g7zOFzjI8c2aFvpNi17YX4dwKiY3M9NqYBHyGoB84CWaCw1wq3DZsArBWH-OWYXXB_FPqiQC59sBC9mkNFhWmp2Q6fVRREfuDAJGU76-hW4rI-h-nRhuGiwNn1ovthGLqv0_xArUqZAUnsTgAM0LRPdr5-Ka-Z_fbUnLe2tVgMnYJzqTciAyan82JTDhI4TFkuK6LRlTGKoMqDgDwtkPpk8qUNo5PpXy1uPoHfxqDbPgjCaK6rc5Z2TmI1uqyCWp9n572xQav45jJErgggIa2aovSHQ-WMZW4SwKW_NqjkpfxrG2bFZJsLg8PjBFHJk18jdDW8TJWDxv_70JUBRlEIAkWYXI7MKOdwvtDYz68k2oZx2wF0pUVu059nnSDYKdI-N0FBEopAEF0aUKyEKWoamXdOhRlMcD446bpCF_yjmSZVRbPw33hkBAWFA_dsyiOYDqNdRd-7Q_DJYI1sS-Qh5kYuOnerKLil8C1eZ1Rf8MySkOlE2a21DwyxftUl4UKO1sMsN174iRRtomSZDRsrgHs48L31gOx9CxAQpE2KdP6B_Y4dUwCWRpw-AGIQ1-U_-adK9SVTBCGU8dtUCpaCW7jRnhBrY11V9cs2_H6NL-4HdlSPwh2rMlvkCSNU71R7A3SQyMJJARVOLIMDNweEFC41VrKpAUJ2-zSUs1xYNxRj9-bvRJKkfzYWNshTrO-pdLiIJjFeSkrgDSx1gKBsKIv66B_PxgtwfdJOygDOdenUpWjds0tLaUz9q6I-ZwfZqc9akkPyAvEiQrg2j7Oj4gCkDoFgI0AMfzeHQ5icK9AX-7HKErFpi735W3i3hNT70FmpinGjsO5IhXrywp1ZG7DjKrJTq-s3YxhUeZiV_wQhV6Lv25EPeWgF59lJNQfs3bDSGk-InLup0SHys4WARbM0eN2yj5fJEm71dXWz2qLlUdGO-jmQ3yx2KzP6q8sJnVYSgctauSS9MOBHhP8NRwpOXlSxSoQKA53wiOvUTKvAelJ8-xIUrD0yxE0v_raxMbFJvlSmtZr_7VWQVvO0Ri1n4nML5YYhfmZU-7sOBfp8BvxgCNz4WgJa5NTQBVHwsLSAkQ9CIqNd-7J3J6f6TMKLBYeqAZ5EMuTOJDhZTtQ2NzDSyDHqLNfmfXh-BVBqfZr7Ynygp-kKQWBmDjgdTnGYArgdC-L_-h8b5FbJunOjyMo3O6rBN8w_L2YpPNBCiQx0uU5aVbwAGXT_jgG1CS6lwSzBducFRQz4GudMp6DoPSNzp26Udy0Cug1wYyIsP3lJXd0N8bdWs4Wk9ORYpTUO7X8ZLSUo4AGSiNlx6UJ5Xr3ldOvz983r01ToGLf61e42BhsU1ETCf1JkKtGtCAu9eSslbUZH5be9SSzhQw8p9kePJEECGUOjSvWhua2Mro-g2sBkPwvjzFMC0sHO0iQtD3oUiX7yLPIEGL86glpXoSLsY9ukL9OJapj4MbbN-quW0a_frwWk1Dodaah1RhqPlmNY9gAA67OOPzzLSzYHwmFxTAsTamzkpq__tJ3CwfD8u0Fa-w4D0PjE_zGQuB14KQVkj87mtByvnauvnKcBOMUBmiqx0jJKBEasauPMsWhU6tPuh6XAb86_eGIlZMITZmIXhIzEsi7-HQf-pEgdv5SLIN_u88yEjfHn_Jyc-TrqKcyq4JgrQtDLCY2h0I-xT13HLZZzzQfAWN0B30xyhJL_1g6i2RbkQCILogBbkPc3ZnhLheH1f94Hb2JqorKzHM0lO9iB2LKW2GTychDta1VSIHy4TZsGCPR1bcjoP4mABbRsuqfHch_dqgPn0Onw5X5H2ZGY3xLovjISbe6ZoeVidnZEk4iyhm_QHhsXmT-0BMwokkCY-Bm5w1QdK48kcoUDYauf3SddvOWR674PvlORCNB2iJ9pHjzBgaXnbBl2oo4JG39NS97m77nyUOzmwXXbdNmth5HTcIusJJWG9Cf6jysB0c5FknrH8KU0r4sH1gUJi8CnaEaVmmqIlAWiuw2xMowm-hDAiBN4yWOLV6sdW_jDWy7-h7hYN6CWROtSRQX7GPojmvfSpDwVhIZMfpoppmPpdJuZ3FXm813GjEW7xujhOqi4vnyyXuf0f2RrDq9wJfI7b2bLyk3gZEi5aXFoDOyRVnNvPrYwVzvHcMa4IqnVx53axpnsrWlAI31CjrlvEUu9lcAAcG1QHvLwcbKha-Lx8o0vPAePByRc2mQKT7GpR8OfEXf1EdWxNsCaz2bgkRe2lJmaiay62XCybLXBHNx5RDXXb9OGtKAyWzg0kTq6LHPQ3ow20n9IDCvMIGL_4YyAmv4QSvGYiP3vO5fV0kAHWI2sFexvtkjqpRyDSoGqMnq-wtzxr62Tds6Z8Mc_kN2wUiBlLF6jIQ2AYvpyi1OTaOgQUykg_z2t_NXN_GMBGIUCbK8qNOkPYzbRXDTJNJpgi3KhkoP7vHYqwuqkvNSWVD0wFtmLFlo7cEKSgQOVNivE-FdKLNz9r1THAQE-IRTsjAJ0251hhF-A7YcxFQJCdacG-_i9HJgaL53x4yAo2XtCAgQav2sFAEgYVJenEtIvBHUFlYczWKKHtLmQy1zh0vRx9uiId4GXaFZQdfMQICBN0WQtCE8PMMl8WLKNzdSy7joVMM93ERdisJt-WY2IsiEksmbrlXP2pxlIbrlEXluU7ebqz0k8-757ulWofD2e-M5a2SpvMe4awdA2iGov83ANAsYcnlLLxoDS9MtxFuvjwvfRfDg8aJEGgZCqVji3YMmD7U359oExXWLqJ0iZeBKN9lpnyNbJNcZPL4EjUZazg_UPJ5NH00mVaXumvplGbHhDwHnFp7_kY6je8vVhk9SBIKSlmFqLN8fRlO6TSdkLuXVEjA5FpUTBVVbLiVdNHtWHK_NtecLe8yPURLdbbTrnVKwKwifQPQ88jwf5sSoSIHvm2XEudXiVUNhurx7eKyWKD1trVYg07229uk8rVSywJkWoWrrj6XUQAK3VJDHFj0TL06Re18gCi288v3XHMTdZ68cvrlHmtKaT8nr6zyjLrkawk3qrKU-SWg_Rh0QKj5igbNlRmJrRY5D_HEEX6mLDgIIjsaz84OWUy4sggfnMbzngP13__isSX7a3LOlynJ0xHnDJZqJEDjWt0hWtlktaBl9ApQ8EFBMIiK9JzuDrlv9yaIRo7jtNJERpFwIGHwBei3Ipa_bTYSZ6tYyquPSL2WggPWTKdJLyVWUtoygmVC6LDAyp3V9n6GG1VX6EXJ-y_wL_wzU--MLnQzusReOTqRllmIUTUMY0yKU_hwsmMiw4qsHgjiU3S8bJi_dxOFL8LB_QED_SrLm6REfdJBsTEjc0PL3rL30RwArdq4mcNhz0uvhdrgJERrj8JyE6UEi8fK4dgPOjz2Vr2rYEeBU1LhnVey6-i6V20eLR6z8BYiJN54BgG0rvTY6Kf2U_ofmFkbBCR2n4LqXX4JyVrmXD-YnUJxKEpNaehMwC--SF4v2WULsFEi3y10ktyWaLWwaQ1nbPtqnIJ-tHAwIPfnZExeWRWxJO0YAXpbb1jUH39n09r6RevVlUPh8KFBpxw63nt0F0M7vI-fxcHTndonCOfEkX4qP0fsS8jcQli24tr0dr4xPRP_--yeYB3KFTu5olFTKK81x8LW2xhZp5YK5D2zbqeQe0IXVTV12YmCTf1lR4mAnF58hiqxbUj-EecSZ17tXUBlGC8zbW-Mg8AA-bG1DSUcF51SdYv72eD7GuWW7h0pdBjK-PU2yf_VhUkdVADcAFRVYK1JZ0Ch_ND-9buzl8-oZzNTgyI3sDBinLy0q2YkT2GEJoIJUJ-PUoI_jr_csVwhE3lp-s3k96XsH19bmeE1GCBxzCaPRcJbYHMZPKFbZJxWPFRBjPHq93BjaNTKYB1cKeHQY5kqJcqbIaEj0-QujJKMJzU_QmZnhECbNp-CgE50uETnxp45UvC0L29M0Kkdm2aJ-5QS_reHcmzXNwlzyDcoOGEULG0HXtnE3n-W95hgCc9s-gah_DFtMkO-Fot-g0Pizte9H9pxlYisKCBzV8-J7L4vvIvVVDhayRVa9hBrcnNaNhNnPLAI5Oj00thcZKw45QQV0xQ5jveVGUI_Mm-Swf6TYo-g-1pEn4fkC_00wsRPpbQR3aHkAR24da9mOrBIQxxLtdNHaeittXiuHkyj-ax07U4ooRvaPncsQiAOX3d0ECZQxcldArUB0GUxzXmiaDRezp1naj_me4dmcDnWjZ68k64jnc4AR_JztQzBsxDAt4GRjg6WXIyWQsjvmQrtjgFMnJzQKkSAFvf4G2aofP9cTgVvIz80w34bn4aJxI3OaW_xQOS2SwINFOpVN-xdoJqs5r95uLAK-iEBgVl527eXYuynFx0GvOnKBVpnuD3EHJcK1PQkBZItuHIUfW1CunOVxTJrJHVHpuLRUHzhipb1hmJb51Y-nUsC4fdyzjr0o62awwfUF_yBA0--irijN443vEny2tqvuTuDGEFa6hj30KxQtintpcUF89WrWE9ONu6iAKZvBIspZF5EdOtYlhMcPvR4cWPOqNT5WPzowQC1QFk_tsJvSg8PB3zVHrqtVGBUq3m4HUVb_u7gaRtw1W66oIJ6bn8Qbi9d-wa0P8xgssEtFmNnfd6hSZE5VAg0DOIkiy1VVOXFEX67Ku9XLZWxl5iQ0Yze1qrCQ5nPaAEEAFc1XYKnRpBvMskTQIGjQJ9rz4XGg_R1H_ROCNSvLyO39HIe6FqURON9-h3ZbdhCpnpuFDMtB64Jrem_l16xwhT6-oShlYCiRnTzBZF0tBkqmM1bW0P1e0GPGXTlP4qMFBjQUeoDnV99mU5TsG634Mc3IthzK9q4vVQWthHv7YWs_0Y2ujnUeOT_htXvJQ8htnXITBIo2BPftRlr4d7UAti8I6jwNg2I_NayxEd50-LZhADHntDzfKBtfPpsFkR9AVdEHh7k8ykm_kY0k1hT0jCMDleRJdnrrtGZ3Qe51LfHGkcUXWX5-mkwESCsKBtZsUCiSL8xAojbrYwoPEwVory7L_qO-tIJEoUwBjdFy3HIX0k8_PIsDpsP72JPBEQxAcxThXRJYQct9dKENczrPvtwcADRPQx3sbp6Fn2qPjC5ai5al4-1q6_6DePd987SmCaK59hOoESSo7YvHK7r2S5KTDYCUTfG-GWZUhIrIvItfS1cwYWyNA23XkUr9BoX4KMYoitENFYrSYe73IU8dP4vTkeDFD6NggjIy90vQCcKdP25lSjVvW3h_n7-jAQ_6GSsgjx8iwjoDRdG4CbnCYJcu22aPc3jbtyoiIBmJAnM8e2Fe9frb2ekp-tlFWCRRu-P679wD1M5rcLwNW60cSUBKuSwnihnWHS4KzVPTU99fcs8kurRHbg0JHq-2W2Yypjk5V3tSn1OZ9eJjC0CZW4lmdKf7kt75AyRF6z0rW9aOJm8MY_gx8b744bMIj14qzHDDmB50ufCqFSC4CZjqTNKmHAgZQjtzDQvfpyC-AFlUQS4Vfee6-JaODua0I0bq8YypvaYBVLWfAJj2dH5tvczP5CbeX06P7iH6F91xQ-PMqDmwSordQM5MSPE0utwQKA3DdWbmAPmEJH5c9t5Y9Zk4YGzguY45Qb0N3o1Gz2Xsz1z4kVEzV0KohixfNYR3nQRHA9HIOsQVx2tvMBtJqIyVcAKwB1fWH6WMQ-pW6H1-_H2RMfuQKg7Aa6vIq_RicNQr-b2nzukL372n0g0JxX6vO4Res_r-5vpsqgWWqPD3FpRcEs8jHCxVPlzINpV8zRYom5eVzCoxvMgC1rhX2-CTzRewUU3F6bq6L2B1-kVdVNqOYItjD7L2BT_7yQmcc9-RSQhU3uOkSW6LakLFQkNvC8EMjMW5qjMRxwij1G20KrFLyy5Iaqo-QzBCG25rL2w7F4Fpb_qH74fO4imgwZAlGjASGROH4CNmSW9LEyKL6XQSvDFbTTLOsOWy8OxJB2uf8k-nR4oNLJtcBsebsJ_rozfxuwCiuPb5I2i4zwsb8cnS7jQbjxjmR4Fhcf7uFxwgX4MTxAW_G85zGwWvPZMoTXewDASr7Zuh_BIjW56rGHf44X6bS-MFTRKBs6vFtzZ-oEAwlY1_kuLdctdCu_FqAzqOxbRAu0J4EowVGM96SbrgtxZUbg9sZVSAvkmAJQBvZD0fNeZxwoJAFVvM90E_Av27u2C5oh0RgOAWJkPL-5Qafp47Mx1DF_1oTHD0IVgpzzM4azxVSw-FMSTU8-CNBTSBAJCiiDKwRFZsT_Ce7tRVvKgIL4Nn73ueBIXd-991ch7D5L3gPNuwhMuOqbGz53JLmrykoBVOaOLGJUq_n8QkTNl6hlvS0lnrYEXjfYLiAILOSaOliA5glfVXH9k2rwVQjw4HJOyfT67yuVKyvJ9AsnZPivnKONZpkExRlGF0qRl5mHYFpipPidvp1pkoI8TNgFmZO3TPvnz1NhT0Sz0fM8TJOkLICS5r2-ZByK9legEUiC1yq8pxJrnzqlJR9G8El6TuOjW7-bnikezRzuGrkSopLeIV14HEkAAK81l5kubthT5VmHJYGvS4k-rZq3EVENn-WMAHbKnAaEX9lRk3iY4XQaIPugTmJLEhZF32PSpKTPsRrfAKcwGKgGFV1lCP6g0il6-0dwmz-fXsSmvS_e3bWqtCHn_dIw8xikaAuNBpwpQlEVAJNfVAOQ2McAa1PZNpUkUWOdIjt40771XkbahfSDyQXygN4VzmuKqOJxmKw2CylXy1ANF7VWRU9xAEgC1wBi92nB9IMmR0KezqBHONLt-ba4A0khw_i_nGlSPJb-A7V_E9MdE9a0hLqBFmrQ4Wh5mvKLz7RJw9rIkUMXOkxU1uwRlxDeEvuajm8w-BXGmrS8-2Dh9zDqKMjnwhsaK7Ej9qZyxXGuyK4EzGwPvtfRGSxIJnW6v1VQwASEs9mXQ8Vcd8TSkVSLQN913ZAokHRYX3hG560X0Stks43SusDeXJThsuYhg_cx1mi_dUTocNiYHvjvEpSXTNXohgypM3xgFwasbJuThjcYY-9KHq-LgdkTBNyHEqMggjXGZqURWQYGkYhLoTDnMc9X0Lu2sf5D7ezHae2ViH7PgiC0uPy7c2gaqQeP7QK9XGLMYhmsxNoLyko995SPSBBS3ww3RwDFeUHGTgSlf09Qc6k8aNIhvEUrHUuKMArFFC3XDgld1FwIaioGFxpWfw91Y2aTlH2x5Y-7mWfbEk8jVv-5cE5tf82FV0-q53NiXsCLaOlE4YfJUBw18oPK71Z1hmk_SX4aC-c2IndgyMTkxJLqxq6H5i90aM1vaHESZOyiQ_X-ePPHawLUi_-8Ahf8RNdF4ZzfifwjWEDUnPybgAfWcDkH_Hmn8X_mj2jn4gavvXNS2oe837cQ8YuF0tz5uNARmldNKQ0Tsw1ghboEE0ZB1h9SjCnXhVL4XCWyf1zCkrm3Jy8BOrHl5lM5AJPSeM4w5qAXyNT2rBuGx2IJxXO5Rw6GHNh6d_tjwCy-y7P7sVZGcU7tQ0Y7XbGDsySn8VqY2dm12iqa05L-8s5RaqABMEzwim0q0o0eBqfiRuLlcHSGCJiZu5ArGtn3TZfWJLJ9NmN-_WMSSgv5pUFfiwqQUB89XD_rhfFsywxsLf8JAaYPYlUJ2AVa0UQdUz53AfBuCoOdpnlpg-uuEfSR9DuiHvbUia9Ni2oumWdko_8oUwE3o9O3fm-yXsUWO_OQuztZpbzufHZBxCY_ImLiQo1eLSovqK9AeWEZqT0majKnRo3Ay7WUVxc55XJVKfH2cDpuiICf74omba3hrhKFOUh_I4JNdkLD2jpz7H9oPHuWdRYE-D136HvygjGGbtZvYdps6cvFG2W64COO1z3TiZnN55wgcJyMZzZ4hi5gsqId7XOwdWOkw1NY0IYxkSMpKt95ASextdo3RnzZzEkCjl8yYJMUtCB9JRUCt1FvFKwoX_JBcD9RQDrdNIEEGtJuPHsf6k9PPx9QwD79ldZQ8W1xZADSUIxZiHctyHi3QsjFSxXUfaOA6GpWJdnb-GAm60qKdPpwYE1hU42EP-OlvQkqobMyGWHW8oYDQM7Cy3T-s56wxRSeb-nCSqq6VHAsBz_5ZlOTs9OWpg80ijzurWDfC3FaNHbzw-c4Oo0-bt_TneLc2esKnME3KP_8cVeNMUkyYhYAirl-KUR90UEQfoT-VQet1koHMUv2ieJ_V1ok1mztaOfKH04b2lsbZ8QyUOGZoYealXX-zKODroaEI8VDxWWSWOojAZ5zRwXMdq1pRmkqAbAKr8Wzv8tSNHh0VNqLpQXXmZce-7WAaGVmFsST-1YZDbNAhOfWIdAsYUZnDvDJbViR99cneJxe5ar3N_UaQZfjEEToK8SSkxqtECjerlwen15dl1z1Tr9YKwYNZ-2f2p8xbVwUKfsSryy7P9DHZ4HtDk0MD0xMUSBiUdjLN3Cx78OuzqDGadLHTm4ZDkSCpjOrcvhOEkk-A1MwvsGiP7rORDZDBVWReBPMiXBcXWmpInqp-spQB9lfP9mhdyBesCLd7eYxmIQAFDx6oOA59HQWGA2-zG76z2pOTCuU1d5CeeL7ii6M3FF7he78uFWTojcKBgZaSOYRXVGtRb41zmPgQvezdx2FGKFPmNII8zB-iMOOhqR19CHu0YES_Lho0TRConPPHiKRHgCFsuGP2FfUIvPLhS22QchFBw0ny07jbo_r64v_YxBF68qI_sQmFdy_kqT9g__0qzBZ3bipa4aKyTFHy1-yvA-rxEEUrDtnBESC4z2iUn8k_3MV0cd0j9mbbiEvUuVfF75dM4k7mNUv7VMZikgPFJC4HEp2Y4NnxVmrucz-o0SItA1JrrrJchz6cUqmBTM1JRyxG2k4a4nd-x3-fvfCF8MOK6Ot_5ecicFWcn4ogV1lfW_RK9eZnIoxUyj6lpRgCYllNw9Q4MCLT2bBMyqfxSaIiislJMVtWZ0MwPWeBCVK21X6hK2OIPAPEvpchXExO9BiZU60BvUhWgzBgJD28Px36LpXNG75L1IzLWz1d3tj25RTE8qhQ021Rlpc6wegB9wxzseQUSFTPJHJNiAKPpksXpI_F5MrTnS-QBYMv4PL-a3D6c9HNHwraElb79c2EQ6JK1o4P1Ik3rozrrkjkvqw-Pqa9y9cKpC7hBkfw2VTkSBSp78FFWz3y5mxOyZoZYBP5o_f3JvVvsnMhmRddBHkOZIZzak9psSquLEAmjCcfCip30aAhlpVulN5g4IYK6E4JwyVa3s02m0w_TASgiI8Ul2-3Hvav9BGkEPRJKNii-cNyZ8zHwdz3N4LjIHIWFla1rv_3Tn_6qdwZBNW22DQCnDKXEWhRQextgF3HNbw4yMgs9vg2616DOUujB0DFXfzxVMVERDLy6aL2D4bSg9JzonN52HSOVRf2SfbZ91aaOdAR1nKDbRgysbia9K30fvYCJfHvrfk3ZwLtM5a1WIKz1s0dKNkMHbtsmzO6qDAZGCJiIVuZ1ZTZLuckNCJphKTqnfS_gTEHnvDgRs07ZQ_ME5HMSYE-7n_H7zmJER0CirWAQajQyxz_NRz_u69V3cUCI0_Aw5UBuJYkLrIOe3obLpqqqKFugPBQQvAHElsK9CosZON79am2Fmbwspt1eoTSkYVVPwTCPm-czkoWmsSeNXXGecmNZYDEquyOLrztCaInvger4vbKJkDFSkU__KFseMee48U0indlRBsO7skLLDwwtJyxDmUZdWico8qaX_202VrA_XLVykMW7CMMutkNeHa-R7HKl4rP13OKz6CsrW0oK4EeXFjy2P7tWyQHemIeTqxpUCiCp5S2C64n91gRDgbmt8MxPApTLTFJYDagXhzff6aKzewwCJZEmMHgXd3K1vYMQ5mdbSDeqTLcEiDW5rtrzDzp-9WL_-BwPeHgauR_7N6uwsHtDApUhpKWccoDstMUa_DW4daFfW81uHbMLO7BzNuZmXFTY8HOnjrLUxPp6ADoVYPgF7xB_QXFCUGiPkBruEcu22ybd3M9h1e-LHP8THiTgctsud3OuQHWlSf2P1b4DoDlezwdiZItGBeB4JyokRwfYdqgXMfWxprvJxQ83H2EwCk7ZH2lw7l_LAPG9v4dgVyjKGRQuV9_TzcD56OWDx0ln_9J6L8uBtT4WVTByuppKs287L5GyxRXZDyKTIpzKdITx5USykySXnIxk_wive0lRW61T0_l2DGzpi0z_-qTXzH9YmVrUTiJkjKmvNJbTD_Y22IM9pH7DBiIl0ED115ogs-EcpkB1DCnQo6BABfN2SMq_iRgTsGPATHEFZlBvoXUlhfO8g3ctpkvmFkJyGCE6W7XJgciQZ6tIk64UkhoOLSGB3xEnJwyZW39VK6gz1Cj26hr5DgGKhJSkXODeokMsy0q7CcibKbGrvEN0dLF3jTBpqRCMOGEyPX2jGZnSYOY7tyGxsmybYgQSHeD_Mgt3r-UqiIhVwHRf4I2JL_F4OR2kKAAZdNK1QVDWSJqvYyQszouCK7pa6Vz1e3l6MaySBVlr-1wwyrC1t0DqF8NThUdKb1dhWNFQKHxhKBw2CamTDzFyTghmah_22wZX3m-0xDuPUjCxHyMN5IVED3Br7kIMg1_r91DxFD6_3bVD1udLUz9lLXg_ksKGscFj2NFh_lmuwQVKc0uB-I6r47nocXI6DPQ4BBdRT5XbwybmlOnFJZyJrFX6Q4IWbzdFuJvpVq4wS0yFxmbRzlTKGyfhNY1ttYMiT_bsrAPCcrWK_tUX7MuKnrRW6sRdF40suzns_EZ2R6Q7gZfEK94c3_vvBopq1gzvbc8-7c71IL1s7uxpKfilkyW_sueh3oXIBU5T8Va6pxA4YfW1KGD_UmDI3NVV1LC_XfM1SjAMgYINItQLaNbG5jmI6TZifSAh5Dm5w4cyyi9rU66C1DEO5d2peimTAOg12A-A7KuMoqgJn-C5kqyPhe3jLAszZj4Rvq5rs4vTUYFAGGliK83KTB0sssLzS9Q5MPI8U5dI1nsMboKcEjqY09gOFKInAy0aeMkM7aTi91hnoWuMD7tWZSqi9hrObUxGKWkmjb9cx0ZOr3ftSL2uWYMUEVFC-7QxMuxLTeviea_5QMQNYEkNPXLHhPe5kG9b3zXrEex6GZuw3tKmPtx_hjSd_F0ERlDFF81BmSM0yWPEdjNLXwWdPHbZDUW39BSK5K4i0-yuJwjVLBBGIRaA-ysllo7Zi4QI4gpRW7CTAgCza0Mu8sCSOfquCZ8MsICMcoWdT0zdCBIXJmXkaklCybbTsUJgy9Z_Umilajloqd3NJse4gVyD1g0L_GgDYN0vJILK0UnWxW8w3_Bw5yXIy8ioAYcd2Vmz17vbrVlcdn-UjvjTkGT3ngKW5MsGCgKgiNGkLy8qm6_RMJoEXNIA-8zIZqnNyV2U0e7egKLQDe1g9DDTHTuhorGeiFDdieOnpnLvA70RLXKaZDuYCjKpik_PtNNHcu1edpG8aTPcvkiop9JUp3g-VcoFj_LP-MHzkclhKNNMIThMGiw35egqLA82XNjIpvVU2PUIiZGXBtLBjdD1VLPjZB5la0eWwrVDVVjbuI3MEXFDCrepVcDrUa2y2kXszhPhaUZ0H0sp8CFNQSDjqTuuHmmG3y6t6zNE8dNfrPdiaVlkLKedcKQOKd7JfohRWbKMC3z5L_1JM3vGAKiQe2nPPOjCF0zkIiq27Kwj8n2EF9QQGFdiqsH0zgZFDBgEgoMfELk0iKAYKS_UuB-_iuT5k4QiIf8SCFjmIg3gr-xCSXUcql3R4UQSAHEc86fy8i5ISIRhKwWF8-IiAwB5tZnKiO3Jkxcs6a1T4lRPpJRUpjmR0jII2c9MuF5sru9ZNqZDiORBMCGYmudTGkYeLUCAWqCQIaaeDVthoBITQQOB-01Pl9uOKLo04dnWcIL3sbGXIRVEnIWe-fZ2SG07aq7NAywFFQfAguQXe5wd8C4wK-MDHIrnZxxQbW978R_x2hw3SSndw5OYMbpc8Qh3TOfR8iemdeFurRu2x7wZuVT2C9v_z8eCuez6-kEQVdGEB6UZEt5gB4chlPCdb2G9HUqSq3Eq2506KvE_7Yyp3oCVzL6rLjRlzf4wxvjFZv0tSatFo21L5VLrGIGKHqflXCBiII9z4eI_ILLc_ROkSCCz2ubcosNyksMkZdrkYFBiT8nwh18jPRTNduz-QJof5KgC5gsJQMCWj-Mo2Z2Muw-CKHRCvJhrWKoUcLXxKK9L1u51RIG5i5yrjee1KY_7feDBuIJv5RxjKFrt4WEjtULqAp3M3jkFGIjz7Mg5s1r96cr2KQwQ151uEvku6-e388Wvc3cU0jEywwuMCNk-7ycF8lAgDd2MvJzd-L2J7yC4uWv-3FwsgUyI55bUJxKNOCwSUSLJjGHlSgEgqehX5mZddftmU811XyWZYJrHWHeNSikUOexUTBB2vOnftWlHlGwXRmIPOHLNlKYDQdsPPpfFQ9dBqRsOtd6lhqmMU7m-iXXFK1QqU3FubI8GEBIoahDzuWsfzUYSQRCmSSO17NJx6_Me8CtQaluBDwpUM3o6EaT4aHYJrepiM-x9x2uPC4-UbOYe6Q8E3V8q7Ug-zj-oTVspKv4U3zRcgMSEPE9TKq0Mae7OOjlYiOW_F4nwznVHeud47-YvCKaed2rmTQMVweKPEAS_ip0KSIBaE5QtgajbGRjkAp0P8AM4GIivszQCrPym9x4hOxw_V8qVGL4fMuptG1TzXBT3rD-20T1MeH814vcV1jNz4SY_F_RzrFASPD_nl5t5jX7SDYeGPaQxN9s1wEZMl92gz0hKsuM9RnEBr_y6YBIZam3LEyggUxwx8gL9MJ4gTQrDhBCq5U8v2yxkZ3D8KQX4q88eVZuoHRiuEUD4iftUpX9L3Wj5PImUzQ2cXKk93SDQqgtxgnU5KwvjMWj0-nRUWtad_O78oPKghoaUbyYCHMTyDY8j9BCSanQn5vUvUKU1SQzkslkQCg-yyElE6BKaT4QzOsISscBYj85HuZHXhp3yEnsziJ44PdH4R3cFKgYjcupSY3dXQQz5EdrSwUz3gNKqz1rpjw8VTO3rRr9iTc4w7eAAAxbQ3ViKliYA8HqqV0TwFLDiC--noN4nq2lDM7tZ4CzhhaxqxOrRMkGriy_syOYrfbWjq09HWSiO_gZDMme_uCXOqVHt7tVosJCD1N002Rm60ljEuQlWxHc9mzV6i74T_w8zhZdZEFPjItMYXBnf5qVAuh3jdCXOxwajQ1RgQANBzBRKSBJvVesKYpA9DQPjqBOFfXg0VOCGBhkMn26dSrRgmtTx_s3iWMLdkv4Vvqu026F2-iRB5ZdAKtqE3_h3VsSLB0mY_AEQGSSWdoHTZnV7hvKOYrE6-waTddnb8arGbmQ_vrT87ddezGS1jXwrggHSdqtGTMa3C4vz9bVuBPEpN1l-yAv6Kxop8DDRjghERCgax5lj0kb4msbttPAjJYltry4ofpBS4Psp1mWFaBQJlXvFASHQYWhaI4xOxlanh20gQSoghxZT7ryxS1Jx0afofNvkSvaCR0fUMEOStd5NLKRc44MHdy_mKE15gaNFELitsAW_ZHokj0KeMe2f5kId6Ne5g8C3D-NyuZCa476Qf83eX_RHQSLymYlYNvI7nmET8BKN3h0gHguxNI082XogRg0I9dLvlk2ptuecstBrf-m8pGe-_qt3ZB6lZDOpPG8SN1kjE4dUqC1qkydj-WqNlbiEcKPAdIzD4Ld8KtTGMuLn-p-3nmusjZK8X8SPe2-jlery3AiWnrZVuiHDhgTVXwkBmlXbwqriryeKqSzmM_Ai83xFo580VR5dY4zIdDQ_4wKGjr8DKXD9PG8TBW_TM8AspWliNWH0cVjC8m4yUC0_Rhq-SqUBois7KyDQ2GX9V_VByfnzUPaSaTe2YhA4GOQU2k4m0p9dEh9ruhq0ClqO7YRyjsrm4ujivISVJO4d6eY7xl2MpDqPwl7MpVM5i0bBwFt5h-qKTAmtz5y3xDf9vRS4wSrJp5e9kogkqA-kkMYsFhJiQSeO424y83tl7GF-dYf7e5nvlf6uhgcC78X8Knqb4gr5LI4dekg38UlwKIeJ6V1OdAa73ziHBCXs8bTlekPkDDdpO8Swa1XBj_UXWXIIdo3tZygWhOexAYXuV74T591Zhed87g0EUeTnXtrh0IH308S8chnWeSetoKLBb-v7E_IrIcdFVMjSsvOVB5Mw5gagRornByKl9IxbJekVVPQwp4Fnw8xR5wKl7pzb7LH9yjAeykK8EToX5zWNcP4alADqSfpemplntDci8JpXvjTfj98kNC_Cj4K8CvYYiMsDR0l3FK805eIyYbolUTLszW67Jvk4U_7i1u6A3an3DTL2aNAXlN6hy1nAiiviEf8xEW0z-rKj4EXCH1Pm2-8kSfsAyasLyziHD8AL-wTqmb017mdpIKY8BUz3wqlkHWsYJgNBMy21V9WwIcw7s3T9TVw6DYozrplw5MMqKoaWGdnLNBaWZo1k_lxSE1E656ux9-oSJK_6IjcStcsPTPtGO1XjaOf4BCm6s4-yxmcyRiqCKucTOfmhWIC0uMUi28Ga41tvLlJK5Uk_lOrbGGnWl6w4UvgzANGEDykFRVyzTSLEsY-fvVP8OfvxuXO_-sqEGvCPXP25iUfGIaa5YZabHHFd1_gEaCs-pcSZizoR8_nCm6O4rOv-dDSwkM3WE6noX1cIbMtuqhViTqXPa6LzaTzZwZke59UGRr7GclwK8DW2CkMpCF-8lQ2qWiS_7w2nEsTP1aYNfz8uDqtPvW71E95t9kDd_guFxqL5krlBzbiefBrqCukC86AZkqg8H8Arme-i5xMNkz8soG2DOffuaJwjt9mHULzzN-cjKzRs_qD_4uohsuCIawit8-LkJYAqLZjJUJwKt-QA6QYwChDIk13CIXMmr-sX84_Ufa2DXU_OXjIMd0DdBjROgoVfkev6PDRnqD_4oRkvy3E_lT3TItBF8tBgjMGoynUUdihxzG9uurik77hu34dIsbKvGTOgtlNH7VqXB8SsA550Ahh57sfg3dIWGFsp434fnLeahDBuj-xqZDO3lCZx-DIPomI3oPJJzUsyYpZP7C7kRWvHp71jm9HtwOJqaCZpyiaJAUR788uNBz82CgJs9AhpMkv7SqrCNbauME0axKscC4k7KeBu_tzoMaiekFX43GphHe9gTHPh2Nc2sa1fM7ds8GSTu0ZlymCcNkfI-tiuhcGowFBinoEbEc2HpC2XGKZK45jUS9uXETepYJoWC8hrKDuBDEkOVHdLUbRlblmRHCDQaoDau9oEDI3aEWShgwI5rEL3X1sDVFaKPSpZpYHDjh7p_vf97vLHPPQvRHbYDM7h9MWjjIb247l1G1SfSB0W48D4kUirjO9UeVmEK4wlBWuYoeKbUgurDYqqIjcyAABSqy9UJoetlgp49c6ogkGuCIgfSCwApw4XxDGYgGjQA_HMu9PwlkT36G0Uj2fRJ_naH1Bb22MvFp7jc_2EzVqR_Na1_6r5xnTET0ThKM9bLYaNiNq8J7Utu3CjDODlK2v-kRj0423IpLOCg21xiFl3LgXmuehtLMI7k5Mdtk4TYvGjFQoyxPIXy8y2NTVwPaGwVUgLmTA1_l2prDfhDVoBYBd73tx15P7eAx-bAgKPyna4zNf4O1iEx408XTCsJ5HagH2KO4ektu-Ux6fulEL2TkMu_PJm-RrAGb0E76LL-FrlwcCpa2LexkLUD9XoPdQP8NtoL36yHyEswseou2uwXyDWMiXd6js1v7MofnOIWkScpltB23z_-kgJgLYmG_UFtZ8i7KlR4HPyTr7JQ2e1EZmZ1yRJYTZSVxbhlSiKJbQFDwk9JM78XZvoQ-rCBD2JdbT2k258ZPbsqzKPcHaCavZsagLl9_DexFJa_uwqiMxjDViuXL95QbkHaAIPTQxNImUuvNWPFCUj0HJIg5rq57uqp4cNTSXHq9Gm7TkTThtqcGo3IBN4YbXCmQ5pqz27mgH57EziardPWnvhAQgqZqeW4e5NYe32dt-XjFPGPWGLFWYrRDwxF2iwgTgk5KdOvXr7g8r1SN01D7Vh3FrfrZTrMIZsdXhpYfJFnHYpYGk3UHp-YZLBs-ntZDPv9VOC8MEp23_eis-uqhqMRebBIK47UPGuOpZMol4t64rHKfvTk2GovqPXBKMOeA7N0RIPXmezKZyyM1ZKjT0oLNXTfckzdR7vo6mm6Q21rHvGXTCRlOYJIZZzkmXLU1rvI-edNPDqeYK1L7mC07O1AOWxKRIDe0l2b0FnbqKQ6ETIJxCeVPLznuGH40rZ6ItCW2qF_N78kAnRNU9tm9zTr9tUOD1LoCqjsgIBntmX5FUwkyf_SpaoMh52XYp9J6NfjPxEsuvBL5LMpRStBy19TbxcJ_4tbGFJLEh1ydZ_rmeFw7w1s7_DbH__-tUyN7_kH5pu-4e0yBq0aazIt62ZP8kAnH0oWhVuA5banZQ3ZQO_AqGXeIn0XQPIG_0jCBPxeYWQFfr4iURqtWeFdelplBwRRgrqSiHCiSMy0HC0JBpvkjniYL5F06rsOqD5m75MJInBWfJ8-H08iURaeyJsl30fFr7dJTvAhQnFLkirf7rVRo3BeUKiJwUax_d0AC6-yZsxEPVbsW3NL3zJSljz6-IFtBtNkBp7jsRp0jlru24zwdzu0yy3mHQlkz-l48nr_rC2IJ_aIOcm6G0DBWNczcElyBAEoVM4s7F-V3khS7k5L5GEzhfyjCgwbOLC9hp_KEBrVHFeAAhKx4hYMusTzo85ZcriDI6rha_th2ueB6mwfpFfUYrwHKiOFAywp66sqYIrJ4NS-_yP5JwVcbgqYBGfXwK3AbDEeRbViQds_wocWr8ApAdC2GV-va5jQkZDl0iPCJlo2BrjuTN_Uk6gumqqtvOeILNDNRQ_-cj9vVMEEB47bQKZcJf2IUPHbbarWXr89FIWWlS1qzmIMgDXbmf_hSGUHNfOwLDqeFOI903NsHxcCv1wiK_2d7nXVvtBXMLpK1FDJBF7QaiGyVCSsX4AqYsi0DBo_MDwD7EM5rT9Hv6hSjBWDfujzcHuk7r7ZdXq_oDXXtwz8zhIhAgB3pssGibZeeIx77nQpO6CVNMgeOnAAGA50F6rPRQHnkfbbqFMe8HDHCc_jPE2Jtq9Fq3EQgfsUOqoNEfQ8PaixvVSUpLPnThiixVYQnCzJOW0_U0XlnNXPcrYQMQPpdUJMFVTkHdGlEaZI6OevXJAFDhHElmJK3_NQkPGmIabVGs9WMqRwfEg_UPZgX6bOHJskhx8nySvl6Q_MzWQ1W5UCOr9DyklRRBBfPhbBxdl6U4jdUl_j6WyoGMshuURQjI6aI_AI35lf33ftLkOs7uEslJ02ugEOOtc9BWYgNdPEn3sCOx6h9pjeRqotFnfjLeKlEjLtEIYH0ieUn2JmK8oxjnti1sQAWalpHrYlaMjWoNU_UB5VO_VpopdhZmVUQZM1Q7um0zuq0ChTw5YNyET_NuibWiha-ZqdCD5VN22crzXfWXW3Sbqtm9aCxCPOYtvh3oIBNIuAMkI3M8Cf1VdmdnfkggQqFX5ooMIqmrYFGuKV_3pES8N9cg2gy8_xpfjLhetxuHyi_8owd9Qo56zUXHEgZD9pPVAm-FrVcDNJeS9RSW8h1Cq98jdTdgI1l9GaOoNB6NZJ8mxvd_ySi2kwFgI427yKCveZ1Wn56R1jhBZGATcb4jL_IvjP05er-R0oCnZ3Z93o3QCzA0pXTav_zfE1Go2d9mfO5X4U_32iD1acvS9vLbdgwgfVy7scDV1DaIA8LTsGkXjPxrlrwKB-JfSf1pI9K1V3Akfyh5DQej9DCrA3Q7IMdaPZcr8qIKjWkiikbIa0oa8gaoCaDD6v_AIySxIGKrsRnpeUmIHFVR6O9yz1vIkmx-iqMGeh749vf3NTYq3LeGBO04PIAm1KxT4RBPY3p4DecN6k2C61DEk7A7EdOdIOzd9d6cNPhW2PlOpTJE3TnS770uoVqfvMp48dl9iiaqaQM-0jouwLXtRlyW6syaUoKw1Z-L0HhjErUFq1mM0ul_adMeze4yBQiYvG4CGB3_yeEWWhhpuWTS6_AvaV1J_1ZbIDSxRXG8cRycFrC8Q4vpzfp7JSY65upoaoNEgC479-UKUsSAHuFbdxb8Nj_E1F2OCdF2TdUnZvBTNkBw1LTHS2Tuqia_Olt-CjlriqqDdh97rSLfiPdbVuj45ZFqfjfem-9feWeNszCBJON-LrFYOzKTRH7xmZs7MzGxp7j76brHBxJV3S91V9VAJnos43C6ecmPLYEnZdvUP8HYdXVFu_ruIgisF7G5w25wx9IhR8OKi3OhiAiggHI5VdLfPRjf65_VUxygbRvZRhLZZQHfkYGKR0JUA6_0YS2Am9exENmar4nCPSQjOC49X82kgYkXL7jje03hKSkcva9fDjqITRDBAlN1CAcOdao5JJmzZYG7d5UHdenGz7YQgMQDHVFzncoYGUM2Nm68RLBKelIxxZMi4NyMw7Bm4VJ5r6j4H8pcqiUowGY276IhKQRARLKdthL_yc2Am2vv8qrwswvlGHA3qb6HNOcbV7seAcHpSBfIxZAZ5tmE2JVZ_KwEaXWFQlNm1r8EfbORhbvY8AcJ5ju0ewBegvja3usqzYM-IqG6-a1hV7tYSA9Ttf9F787vm8GGN85-J7ZjmFqsUmj7I38Ozqe-13JjrefxPxYWP-yzvQUh6nSpk0lAeduu7tX-em9SdplZXvfPa0jg_U4c_29bpOLKSA3FoWtsNx0wrW2O1TPvxBQxBoBk00OCRYzm0tfK53ABh8VLUUTI1LS6-Z8-Ot3tseKQdt8RnwXzv9C-dBjS9zs1e_YyWddP5YCftbPOIZ0TIzoiD4zBZnVjrqVyswOr34DlQmNW3RCEaeFshNPDjJBFOLIF9beIKme-54MipnP2sA0GY60hMcuqYL9xaMQOuRSVcVj2L0UX8AMfMt-hHat6m2Zvlan-tTWIEyftYjARspd2iyOTCpH50KcmyiIPst1fB3o8nBVKbgGOF2hvDMv7ycmXJBGK_IoXg2xdv7_NaezKb5UHx5E_YB0-7dIaJoLh2isWTVO1hHqYhyKOe-Sf8pnaNN4Dd5dD4nXeL9Vr125OPhELdhOSFDxNvGBJd127sMx7NCEM9QM_qZWJc0BHbH_VnUxYcaGgZCK2ggjV6nnCquzs-AyHa6Zbo9mG-1z5pu9tOposSgNwmWIZ63Sp4MUN1qk-b4Twlx6iCyGqleGwEtS4WF-UjjnegVPa_GDoxnBG38maUtSEi5oqjrlDuT-oirB2rE5JgnMFcONuhHWjrOLHyFncwMJ5tihyqF4qNxz_FDWdb1jB-afv6B89q8Kq9yMtNx4xwuDUBaDW6rF2LCuZHMrnorsehwztsgoq1ya26SBBhTHlRoGFODWWXq2GRIdMN173y-LRUT0qptAZXnA9o4rUyFUM0XUk7BIYPORuumT_XlhaeRx-4LvPYrveEaPEIWPQKbWm9vFaLmqqiQpCQmXbWvKluGOFD2iEpnhZx2_9-LyZiv8BKRSBSX7mfrGvTrwo8uBOEYbAA8LgEnl8A4-aFdiR4rRP1WJwEELShEaP4ohE2aIecaovKq5ZMv_lWzT0wx8OvZ7WKclzkbQIEeEF_GPyab7aNGBk32KUBIhdLTE_e6sIf1f3mCU2mnzhSoUaN1-OVLiqPb6Kt00bIizytVynws5oIT4x8moZrxk2EL0qT3MhojKDE_qApbc40NWrmRms2eyk0hNkOjxMTyRAqCz4A3hv5MZw6Yr66sHJdCNR7KIvtHZbTMYWAu28slestWiEGpk3hkLXJi38qUsNozSBzQXK6Rbe4mCBQz7teIbQJcubLm3bDawwRsZragEMY3jqEYlKTVQ5w2oUW33rFm8_PuwJ8EfmkzLWCD-rH-AFIbYNhFW10hwVy9W1w8mEfcLIGM_-wvTqvOOWyuK5HihlvQaDoYqPH_tvYtXCDjtH3Xd2Hwcj2mLTIdW1LRmGIXyQYwVhXQvCcCWupLqKqytyy0Sr5Kswd77yNHMu2EFNvxH1Il4SMyirxTfQ2IuTkIORFDhHvaVQ69ewqtOWMH6_zNLofVWAays9F5GjIQaKddY6OFyKp5sjZTYXeOjRCDar6DevVVh93QbosIGLhQd9h8WnccS4bjxWzdJSPtD40U_mxk-MDBqD65G--dDzguMhcOb6M6s9SuQfgzYfZQSocTdHUjUVcgDiGkDQtb8SJAtKSXjSbKp97GtVItniks8tB0WUfdE8aWsWvFFN6_gmi0Fn61CM5NgofmthTapsOaYRu9emdGOUttu17v3-Y_fyC1BYlM2naQfVmY1t-q7Faz9uGWDv9sG2hFfrrK9cAdG1c47cqp0-aR0jP9jwsfO2K6RjCT7m2-Poe3GjGDFypVSe-A6_kppEYR77f9OXSW9U0A_Ismjb7Qr2EOXdCWqOh8jQlLxRaJvSEICPoVYnbEG0t1W9d8qCCx3RuDk93NnGUmw8X6WVk85MzrjkrgeIezmBCBRpvfveNAHBZSJ3yyktu0iyzM7UiJ0l76R_1nJN0kASllcDZ0bM05xZQBb9y9VENksjBkQkElN5lZ5eJbl4fOW5cp7QhXBc4jN1TzZpxb7SccoBA4Wc7P3JFqD7yHZMyMQ1X8BQHeswiU-xinnyN1R8SJzpYP6BlAGUqCQ__R3J-4mJ7fJ6WF8KrNswtrb6DsWeL3IajiSl9oigcZqPFgx318nl9rkkKOo4yiUAwd69XqqlJg4UN0I4QitA6HdPdKFpVDgdYRRKplZFfOj8LFsApMYYdr6x1wkD4GqLt5h7XSOthg3mg13Fug73oIaDQWbSO4Hjxqf7QpJIQtqyN9R7ghm9AizHGhKB1l4jlHFEd96MaecRxMqappiTJA1mJogeQlwY6C7T2j4yZ6OpPsARyyySIb-94GFi6GDM_OidpX8uEZUwPy97yCmutjP_whNnIN7bqzVHfqKH5srbmssIm-O4cQ9Ul9hOUuBO-fvQY995Uj_eScKg8nZ3DpN-BMw4xoEY0QPQa-PGpPNT6N9x8jLJpMK0dwyY3JCedqIAjeIl9okZetIoFXBSMBhllHW7dKreVCi0XJ2rQa6kRfXgjdPfKq4v8Y7XssHUUZYwfAWxdxO5GdFAt01ees344-DYXbXUbT9w75nBYHBp5XL5xQRyXj-6iDIRp_eAyxL3i1cUPsBxDTN6FUzdXiKLBwyIlsNtB0DEtFGF3NN8rKvwc0Nz9ff7qwESjbcUtr4MewuxmBAjO8F17RZnL1cGY2N5hIKIa_7vmoWO8x9NXy3v0eOnjLiAehHVt0NDlSv21EQf536slwpya8c-ZJLcawDeMZmAtK9Fnzb692ul2OXG15TdWEJ5xXMDtsi_VqaXJ1Agq68XqWVX9mIZu-h6a6q04j-3bkqjJ_Q2_iPvzDipmf9Sjj-JH3iPZljNN3UbnxtSmyCg36Ui87qSYS3_YOJG0-uLs3PNctpeqcqKPz4HZ70UKNsW6-bksi6H0iTQaFyVKxTD_OIuV2_Pj73Li0G8-qx0E3SGqeuErapDsxDLCjXEaulxyrGn2kA9fcvJHaVQiPnc8jvGhJf1PxFKbD1veWwu_ph2aP_3ShsVXCRmFTNUac7lmiO-1G-U3cLtCzdTcv2NPyKm57TGiUM8Z0hsSAYKa8glN2gf5e6G8XWUrFgvt-EBAHyFWdMeiEGukv8knfFebhdXjQBB4DpaJ2wUohXwMYTDjbzphyalDFfUEU8RPACo4H5gJB84eZtrsGLuFXMk6XfLCZrFzbc9_TeI-lppd0-lALi3sfuXGzXxBuHvALO0fSlqNEYro9WSCeqjPA2G2HqmbLu6ET00C5S1NdPtRKIBRzY4lIOqDT2SZl_i5HgNzqkxqzEETFCeSuz2Y9AoTHZ3qwW_7DpV_VPUA6sLP6cSuAmLx2Df2W-Drb_sUAkGJJOtafweOj4JF5PaArWG2KDb9xL_L33lQKaAJNmT0ye3lafMTBIbEu1T5zzi-pCzR8q4uMkjc9VbSZZoHwkR_rngUla-ZDOaxlzjDSdmZYQSffal4ryX856qVY4PHiuqP2aT6PkSPtd_ADSFXMx24FJR_LDSmPWTXZyCLfYE9SRv2QOB0poWJXScMZIjG7lvRExyKzbYMfRKnqnvxCIppjrXmtjawvOk99jRApwKFWnADJgXSTU6CtBtUz7TsKDJ9YJqalzzWSQ0cIwq1u6bSHhhpgw-aQrtlZVPf0amgkTALVFGo_GMc8WPGa-_xY5qqAGILfzaQW9nZdbB9rzFm1fBHkuyprE3t5axdOA_QnXSa6ppFBeqasrlwqpE17Mtx1aZeUhaky95run2blHKjy9qHULxLJaYpPuPWIpaV6rlL7QYEjXRWObJ2jnPkcXC0DIBBPuM1kg9lPl4mUh63VgGAQ7Kyy36GjzRj9MrjSX45QJjZ0pniNnMNy05UJKKtB0HHQ9OGuKe1HJ0CnMFcG8BC9qbf-TLZKb6m5ExDz6JRba_Qypg4snvFT5tIxmUspOq_G23I1iPuCmP0VjwFGS_qO9y_pDhIPFmPx1-XLLcCdt6SHAfZCLGz6Ok93pT32H7Y0HnlKjj5D8m3zHVjS652LJIPcItw0bHsdivzUhLzGmgf6ePqvScVRIj879SSj8fVANHSzj50L8h0mRM_0VGLxSsR0V6y1t-LOSUh0rM7MhLvWRp5DYXh6gd7YkLbz26H9mSxpJzHNiRCeuKfporUSkGQozkm6cBfEx8haPMMZI0UZ7gP1EA3fqxLP8GNrWnYFmGUxwprxe_qVfmb_mJFueRiOB8HJAqw1-jKb64RdzAKm4gtn0NmJsi_IVidV8UAOP3hEaXEYlVgZQi8w2Dhwu0EfHZjZokKK93xNE91RY822CgYyXGpg7NZ9LwOIfhrdS-oaf9NLjfu5qM24P7X8AOAHDwkGLJvMMaoz27MO4zMowHkaprhk7kLt90FNdzZ95kc2QdZlm6vciIy8Z5rnq-aXt4HqSnnbRa4u2Xbs9uUl1OI_BpI5x9n7QDrq2BO1B-MHwOwZUgCLddbRvbb8O8BZCP-cWqGxMzXRmKn2G2he-nv1aZLf3duVyqlpmduQ3Q9L-Rt4X_POpABtRh56xgmIxunuwQ0_7haXiFONgkYk1Lih3oE6ySa7smMwQ6Pfc9V0JCejGnNLirh-I0v9cEVGJsVvC2ABGzaRQH4VSXKsw0GITyugU3FsUKx0qZE2KPxRGc6Sg9YkkFIwSIvEGa7mwGMeqaBa_7dAHVjhxfDmQ19e0Ogn2Qjck-OV_iZzuaRSHxopH_T6pa6cQy-COlcBgrqnL-03I6AsFkGBAmMkIGJaj9BQm8Dvk6jbw58inOG5s76G0Sc1cfwRWE-ghhusUcBr6z-lJfGajo10C8rqzfhtEwJOejAJNlzIHq6aGZOpCT4Y_NRSeGWsMoXLvaMJpSPT8imSzP67YeypXhuFCAjE2TnEJexGbCrrpLWdmI4h63OD5qgUSNjyNoflGzsrbHv2Eup3LyjsbhA3b7aHr315jKevuaozVvtd_zQY-ByYfuL6e8y6AJyhU4APA-PsYLpp6ehgIfa5KKHPYa5erbBISDSLjfOjDZlS91mTAZijxH9kGV0p9sh4APr5sz81PTIYZsizR0xIr4wQdz1ZJ4Ich3al_v4J8YFV0VhD3emOb19lGz0gFoReBEFki2Z-6uWgfKt8yyDnGD6_XTJZgEQRZBHRwNw90rsDp5l9uvGBiGGtblXDw0m7xAYHK612-MFHUX8Exkw6R0-H228kIMchdE4wvcZwceaRmbCtDPE6Jlz0kkHgKl7PQ3DuD189bwaLROjlBlJ2hDqSwkCJI5c8nda21LT1A9EK8A8M5J_OD6JtlaqF7nDcgezW0GBpEYhjkSTgXvfwaRc5OzOIxrO7Cvq0fShnPSOjI1DMgtd93PbaywUsqviKzmnVe-cuFEYuU-o9iQUAcxEWBZXAP1wIinLygs9QGQdQ-tE6ww71x2NxRy4keCohQ0j1MGlwnNv14A4kf16SBe31grcFqd7w5boBW8ZeA8eqkYyUA0Ck-_XVnE_w4_eELQ_he8bnm3oR-cF649bDTUyWMYYGomgAxhsOB5vurLhP05WCJoHs6-_0XY1eiAqTSR6dSiO-4OvHEAY6dwJDijmmBu1XNC6yImWcBOOZmrJ5tzTr-0U22V6t_h1nGiyABF_goV0nV-jPVNVXBtcwzP8nXeqKuTJwZh3bhua7QBCJjx2EyT5NTTw0ZV0th0QrzO8D_GwOefmN7Dotm13jFoNfJG2ZCtOX4sgNL6E-l19lt139ELWvnxwaSvly2rkgsSC84bgmZrcrt2xclQQBkEmnCf1c_piG3-Ft2Dxqk99D8UouttKo-YqeNlyyfhx5UfvEC09De5w4GIFEJdgZIG0kZfeB9SIEAChv5hC4FYn63lONCQfI8UdKVVI2k9nn96KE146KqHQgJY-SAsmaAjQTA7tzhnVDI1XJp1NDPjb4nwQRMcpE1ljIFqzv2MxZYZav5ZV0zfaJPvf1cYuCpU-vyT1QwhY0sOSEERbrgKwtqSYf3U19q4zvVnovCti8MjSU8P7Fdm-_atgHQxOH2h8nZ-z916nzgYDr4fAAiBGS4XtF0OiQquyfQFNs-aISgLypC4RqIjK4dvnLLta57PLlCcpInhI4GZlNdg1mxV1VVwFu3OZJQaJxBck6J3sA4cHAu4OnQjl3FBWm9r5hylXYUgXCcUJz24zAW5hrfhZR_ltKMGkTf9hKMLyYLcQBE6F9CSo0y8ib-3Z5_0oLAZqnmpam6PjUILOIRA0LnSDJXzbsU2DwXIuj7O6lotVbZdOcK-wPf22X2RDBlTO6JHAQfSGvSaVlDPQ4AfP_LlImwm6s_6QLTsi7MHqoSKCnO7nPqgqTSh7bXii-NZQ5FVUDUp_lzOzWAhMhq052gnBm2xH3YMgZN23HsQGLvpTesLZo1H3iGOfKvy3WkNArMDACFQ5FRr76B8dphRIwzegdReZTB9AcIy-aFVygnFOA-XgOzsPEuuk3VUCYgkr7AiF8kvXtHkBZ9k0ZXuR3Q1QqEdC78EvfWQoRmX_GheBmac-7jfjByOW0qKW_RBR97bCKKy1iI-n2lbIiSLIowhMAibn-cAwIWJTERDDntmhYKear7cidfxaS1PLOEdZJ_rtbT72Ce82gwH-tA-sd83HirWLQ2tDdgroC5I-bzydhA6CSlWC-8_5ABqpG4y5mLXCRL8a75BghbAlaPrF6NIq_AQkR7zXYBCDfpvz-_0YS1EcXvDXoCsQVeC7KXt1S7W8S2sSLtSZgEFoy36JplhHxzaamPbyT0Tm8q7VTxRexQF6QcTE2YfjBw4zw0oSbLNmaBKofZiXYhXKGpJjI-NOTtXfEmNOxlt3AnZzoN_wqvdAEFmfBKnAUuOM0W-GqlM9N_2jWD61K9QR2LMYMJFjg2qs7PyI1orBI753rcAJ8hhP3Lc-uXqPIRliHsmmqB3-iqscuCS9ICS80kisnlM6Rxf2xq6CG02gaIySxE_BiNGrVPE-eoNUFTYa3q38kG0fFJSX7hEKWtlVGh2WBafMtlvAPdfXM76bPcSzsd6twNm-gsKlMUGs64VPMPa0hkBGWi4OBgjV98UHmLqkn039yOa-9lAzlZ7awr7-nuOqTEud7z26SMNZDTLVhKy8jk7ZxvpbdNINy0sKbpjRH3N5N53fCMUxUFJPQs3sPDfuWHm9Ar_GVQb0QmtU-8EmUmIrmsQZMessIXQ54pMah9pN27vUPD_j8CyjYGCfuA_C3QqpIv_SS7XpOsioS7IkPZQ03TgCDP-rfxf1o4Ty6VrciywzvYO2dMtsrcjUp0_Ek3LpaPEBLs9FzO5lEM_ogLagDX7Fti-I1cBkMBi_AjCacMePs980z2YIcqqXHmbBGk6iA18_z_Jp38QgGo6Jzs5XlsqrUEJXFgXg58tal_MUaVcRyQ9HH_VYXHUiCjXiqDWi72ZK-aHW3em_34dQH-dNBQj_RG7JwUWAcyxsPNcKsPwazQMxukKrTf3aDNJaXo8Vr_nwQeTQMTeYUtV8wvQSngkfNrnXh-0PKnEaC3IkOSHFaURMl8eQseQ9bVhVINB2zlsezsc8s3wGtFHYUHuAeRpdNhDDBbAnt3idPfj3eDiMvpV2eK9_Yq4iOVHq6Q5uo9Fp2b6Sgb5Nhb189GFswi1ZP4EgUYAcTBlI7iulxywS1qTK5DwKchvSMje7QiErXwdOEP6ITbzjK-mpzgMw9p6WEcdHQCqoqynmpZ8g3YxwM8zNONTPyX92_vOrHx_9_qv9V_t_pL3MBfkyyAEjSOdm78ZAYf_-NpXi-Di_9Upd1__887__96__-fd_ADXxlWgRcgEA */\\n:root {\\n --zylem-logo-url: url(data:image/png;base64,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);\\n}\\n:host {\\n --zylem-logo-url: url(data:image/png;base64,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);\\n}\\n\\n/* vanilla-extract-css-ns:src/global/hyperglass-base.css.ts.vanilla.css?source=#H4sIAAAAAAAAE8VXXW_iOhB951eMVkLCUowck1BIX_Z_rO6DkwxgNdiR7VC6q_73KzsBEgilXF1phUiD5-vk-Hgmnf_-qHBPdx81mm0lrKVGawd_JgB7qegO5XbnMogZO-xeJwCFrrTJ4CDMjNI2NixRh0dHvMdGK0c3Yi-rj6FfzxAcc1G8bY1uVEnvZr34XIfIvdhiBhMAMKKUoqJb_xeVmxXSFBWCcLBgU2DTCMw2F7P1SwTxchkBX_AI2DxekQicEcrWwqBysOBTEvmElVQozCUhfUlL3HZpeJpGcLkwcr8CeyGQ8OndwOXqTsHxbElKIK6PQ9BxfRzPsWYXzN9PNYErnq38jWH_p-ES9W95Uh_DpXf7OvmczMdFlW100Vh6kFbmFUYwP-nCrxqptkOHIELdOP9gGSitMEDTR2p3otTvQ73gZoOF6yUjPSR545xWmdJuNj_JS1ldIS0qFIacsTitq1wYmjsVytfaSie1ysBgJZw84G3WLMeNNjiWo2dD5aT7oFsjSyod7k-mUKbQyqFyGfz48TqoKnKrq8aFJ5fKosuAtSyYEg31e93YDKTaoZGujZXKoaF4QOVsj7fzlmY3UvHyoUnQeDhPd2V-1zpPOIHkoUf6lQeBNJ1O4PqgtwLkXnX-cmW9UMWmPv2V2WCNwnkWutvX0NiONK9QlXSvS8zAFgZReYuuRSHdR-bh-t_hdHT5R4oOBLjXfokqbfaiImMmFBapbhyJToXGvDbCuq_DbyW40wc0Qd6_SmlFXmH5D_lSmI8ibuTaBvRFO7oLPD1vQ4_M9BayKPxpegrzw5Ab0F3EQ9Spb2npDepVD7YtjK6qM66xgdm6eLTdPDv1Xt96fedl8zQl7WrMIs6iBfNrQfGX4HdZul0GbifVTf0so--Yv0lHz_53IY34Bphd_njhmzXAecQvBs37bj3qjCjenqnaRrTsD_vWer1uQXzVnfqDjEXhM19wEo3QG8ekN2xP33bekUvfzPyoA6srWY4lWZLv8bBr9vlzPPiIr3no8PEhvtSP7wj4yjfSFSfPUMY5i3jCOyaS1ShxL7z_phKvoyWPYuYta35i7jJ3wyQKHDJgY3wnfntaLzpwO-9f8gTHbe95nuk27urUPyArYRFPWfcYy2SUrPWALB5HL8soDkd5vSLhuX7usZQCZrXBDRpLDZZNgWXXyf3LhP9NArT__WViOLZO8__h1Py8wfJXpsp_wPm3Rsk3oH5OftqmrrVxFpR2MPMRpdE13cjK-ZOeV42Z-TfvgRqCvG-L3P0_yTZmIwokXdV_ATTfdU3WDQAA */\\n.zylem-hyperglass-root {\\n min-height: 100vh;\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n background-color: var(--zylem-color-background);\\n background-image:\\n radial-gradient(\\n circle at 30% 0%,\\n rgba(97, 166, 232, 0.18),\\n transparent 32%),\\n linear-gradient(\\n -75deg,\\n rgba(255, 255, 255, 0) 0%,\\n rgba(97, 166, 232, 0.07) 42%,\\n rgba(255, 255, 255, 0) 68%),\\n linear-gradient(rgba(97, 166, 232, 0.045) 1px, transparent 1px),\\n linear-gradient(\\n 90deg,\\n rgba(97, 166, 232, 0.045) 1px,\\n transparent 1px);\\n background-size:\\n 100% 100%,\\n 100% 100%,\\n 24px 24px,\\n 24px 24px;\\n}\\n.zylem-hyperglass-root :focus-visible,\\n.zylem-focus-ring:focus-visible {\\n outline: none;\\n box-shadow: var(--zylem-effect-focus-ring);\\n}\\n.zylem-button:not(.zylem-console-clear),\\n.zylem-toolbar-btn {\\n position: relative;\\n}\\n.zylem-button::before,\\n.zylem-toolbar-btn::before,\\n.entity-grid-item::before {\\n content: \\\"\\\";\\n position: absolute;\\n inset: 0;\\n border-radius: inherit;\\n pointer-events: none;\\n background:\\n linear-gradient(\\n -45deg,\\n rgba(255, 255, 255, 0) 0%,\\n rgba(255, 255, 255, 0.42) 40%,\\n rgba(255, 255, 255, 0.42) 50%,\\n rgba(255, 255, 255, 0) 55%);\\n background-size: 200% 200%;\\n background-position: 0% 50%;\\n background-repeat: no-repeat;\\n mix-blend-mode: screen;\\n opacity: 0.4;\\n transition: background-position var(--zylem-motion-normal) var(--zylem-motion-ease-out), opacity var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-button:hover:not([disabled])::before,\\n.zylem-toolbar-btn:hover:not([disabled])::before,\\n.entity-grid-item:hover::before {\\n background-position: 25% 50%;\\n opacity: 0.5;\\n}\\n.zylem-button:active:not([disabled])::before,\\n.zylem-toolbar-btn:active:not([disabled])::before,\\n.entity-grid-item:active::before {\\n background-position: 50% 15%;\\n opacity: 0.58;\\n}\\n.zylem-scroll,\\n.zylem-hyperglass-root {\\n scrollbar-color: rgba(97, 166, 232, 0.55) rgba(10, 20, 30, 0.5);\\n scrollbar-width: thin;\\n}\\n.zylem-scroll::-webkit-scrollbar,\\n.zylem-hyperglass-root ::-webkit-scrollbar {\\n width: 13px;\\n height: 13px;\\n}\\n.zylem-scroll::-webkit-scrollbar-track,\\n.zylem-hyperglass-root ::-webkit-scrollbar-track {\\n border-radius: 999px;\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(0, 0, 0, 0.32),\\n rgba(97, 166, 232, 0.11),\\n rgba(255, 255, 255, 0.045));\\n border: 1px solid rgba(97, 166, 232, 0.16);\\n}\\n.zylem-scroll::-webkit-scrollbar-thumb,\\n.zylem-hyperglass-root ::-webkit-scrollbar-thumb {\\n border-radius: 999px;\\n border: 2px solid rgba(5, 16, 28, 0.82);\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(220, 242, 255, 0.48),\\n rgba(97, 166, 232, 0.72) 42%,\\n rgba(19, 62, 102, 0.92));\\n box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.42), inset -1px 0 0 rgba(0, 0, 0, 0.34);\\n}\\n.zylem-scroll::-webkit-scrollbar-thumb:hover,\\n.zylem-hyperglass-root ::-webkit-scrollbar-thumb:hover {\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(240, 250, 255, 0.64),\\n rgba(97, 166, 232, 0.92) 42%,\\n rgba(21, 76, 130, 0.98));\\n}\\n@media (prefers-reduced-motion: reduce) {\\n .zylem-button::before,\\n .zylem-toolbar-btn::before,\\n .entity-grid-item::before {\\n transition: none;\\n background-position: 0% 50%;\\n }\\n .zylem-button:hover:not([disabled])::before,\\n .zylem-toolbar-btn:hover:not([disabled])::before,\\n .entity-grid-item:hover::before {\\n background-position: 0% 50%;\\n }\\n .zylem-button:active:not([disabled])::before,\\n .zylem-toolbar-btn:active:not([disabled])::before,\\n .entity-grid-item:active::before {\\n background-position: 0% 50%;\\n }\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .zylem-glass {\\n background-color: var(--zylem-color-surface);\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/global/common.css.ts.vanilla.css?source=LnNlbGVjdGVkIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS16eWxlbS1tYXRlcmlhbC1idXR0b24tZ2xhc3MtYWN0aXZlKTsKICBib3gtc2hhZG93OiBpbnNldCAwIDAgNnB4IHJnYmEoMjAsIDI1NSwgNjAsIDAuMzUpLCB2YXIoLS16eWxlbS1lZmZlY3QtZ2xvdy1hY3RpdmUpOwp9Ci5vdmVybGF5IHsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQocmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KSAxcHgsIHRyYW5zcGFyZW50IDFweCk7CiAgYmFja2dyb3VuZC1zaXplOiAxMDAlIDNweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQo6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICB3aWR0aDogOHB4OwogIGhlaWdodDogOHB4Owp9Cjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogIGJhY2tncm91bmQ6IHJnYmEoNywgMTksIDMzLCAwLjQpOwogIGJvcmRlci1yYWRpdXM6IDk5OXB4Owp9Cjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogIGJvcmRlci1yYWRpdXM6IDk5OXB4OwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNSwgMTYsIDI4LCAwLjgyKTsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHJnYmEoMjIwLDI0MiwyNTUsMC40KSwgcmdiYSg5NywxNjYsMjMyLDAuNjUpIDQyJSwgcmdiYSgxOSw2MiwxMDIsMC45KSk7Cn0KOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCByZ2JhKDI0MCwyNTAsMjU1LDAuNiksIHJnYmEoOTcsMTY2LDIzMiwwLjkpIDQyJSwgcmdiYSgyMSw3NiwxMzAsMC45OCkpOwp9 */\\n.selected {\\n background: var(--zylem-material-button-glass-active);\\n box-shadow: inset 0 0 6px rgba(20, 255, 60, 0.35), var(--zylem-effect-glow-active);\\n}\\n.overlay {\\n background: linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px);\\n background-size: 100% 3px;\\n pointer-events: none;\\n}\\n::-webkit-scrollbar {\\n width: 8px;\\n height: 8px;\\n}\\n::-webkit-scrollbar-track {\\n background: rgba(7, 19, 33, 0.4);\\n border-radius: 999px;\\n}\\n::-webkit-scrollbar-thumb {\\n border-radius: 999px;\\n border: 1px solid rgba(5, 16, 28, 0.82);\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(220, 242, 255, 0.4),\\n rgba(97, 166, 232, 0.65) 42%,\\n rgba(19, 62, 102, 0.9));\\n}\\n::-webkit-scrollbar-thumb:hover {\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(240, 250, 255, 0.6),\\n rgba(97, 166, 232, 0.9) 42%,\\n rgba(21, 76, 130, 0.98));\\n}\\n\\n/* vanilla-extract-css-ns:src/global/editor-base.css.ts.vanilla.css?source=#H4sIAAAAAAAAE6VY627rKBD-36dAWh0pXpkIu3HauNJqVyv1HfYntscOWwwW4CY5q_PuKy5OSOK0OT2KIgUGhuGbby6k3G1BwaIajZEiQf89IEQ5L9EoNJiXhx8Pv30_cOgxNMxIhWspDGUClFs5SM0Mk6JELdtD8_KAUCWNkX2JiB1waE34uWON2ZYoI-SbHW6BdVtzGn_HTDSwL1H24vQyYUBheAdhdImEFHBti5Fdx8EZErS_U7XA2C_S7DtgVkuBeZfER364qKL1W6fkKBrMetrB-XIuO4lHxS-XWjUlCthcyBQMQI29Q_h5IT9hWIO9tBXXo9JSlahTtPocHToaaedbxg2oEjVKDlhvaSN3C4IIysiwR6qr6GLzlKJsvU5R_piniCwfiySxuC4DrnuJc4dnK4XBLe0ZP5wjEAkcCG4sB8Nqyi0MTHSRQVa4C7CvCDnOaXPgYCFRPeXOAF0ryTmtOOCDs0C-g2q53OFDibzwJZ7dl2jLmgYc2l6OK9jSd2Zx072UZhspxmbLhNPrxxVVOHDGSl7OBLXkVsmEmAXM4kWWRZH42YykOUkfiZ1LLo8pS7yD6o0ZfFQZc3Q97GM2uuGnCrBRtH5zak7UKZFRVOiBKhDmLiXbsa-8EqkaUFjRho26RJvNxlsVK-dMAFW4s4tAmMWGNNClHoA8J2m-ytO8KFKyXCXpDFrrIkGr_FsQZZt0nacZsZJNcg9o3txya31-dfMPjVuRNC9IMG49a9wmti3P0qd1mjl_bp7PQsLmhth72fO5-6axNkq-2RwwKuuNvy2FbsdkNuzd151OUvex7PInt1xSw0SHByqAz_krjkg_h3dMNHLnE5NbXLoTtOSsCR5Y2cAnRYosMIgsi1Vy6fNYcU8NKEY57jjV2huDG6rewiH7cJ_zXdC2UJsg8puOpzgQJkQqPqrFzE47j_smSZCmZlTUwCJb5nkSh38c_PPZ8ApGbJjhMMVizwSeXPi4Cty3NwoZLOBdSSdpmB44PZSo5eAmKGedwMxAr-O0PdCmcdvJeZEZaG3t6Jt78ZZaH3BFVeROPBXWC68WKcqeU-Tz-XNx5Rtm6zjylCOB7kWRTl-yXOdJelyFby4jz6d8f3dhmHL_k8_9l2Vt1KCwBg61mWo88jnt2FVYrpyjJK0It1SbZE4AVAOWo5kLpSMHoqRypKOypgrQepH5y36wndaGvcOt_WS58X6I71sx0d3Ueaq5vpPIHj0lORhL7UCgEpElyaF3qn2N-u119frX66vDDfbm6PUbKWZdzN7LNi4gzKflZWabkly7fffGSEeHEj2FohfiA2rrOt9RTiE0F0C6T663RQj2VHVM2NvPB6DuExQ1IR7qzEN9N7ED8vESN4W9A6CWoqHqdhDM-HTjfeoUOMxbqfoSjcMAqqbatb5LEIaZA-4Ua84BtzMOWcUabKAfODVgbRp7oUvkm86FTYs29_LUJr-e7hcrMuxTlLUqSY6OmUNtr5MrA_5Av8973SbWUCrdbakebFJX1DDp2tdzRY4fF08JBZza8HIA8mPX-8kD4l7-_Ttqw9rDxPlY9Gli9o8kXw8_rLQFSVGekVOljRP5B0U8RNRPFNjwbouzTSiIP8vVOO-ekPha7k2nu7rTvqrjGApfN2KC8KsafrkAXXL9Rjv7Kd2w2xfTKH6lXBHu6boR-JRD6dySzj62BsX6M5r4_OR-2mTzz8L2DclcXZqDIKqe89omZfO1Nf_5Hie_r8cpimhZPuzR42UBzZ-TNBw0J5u_byvrUeN3plkVCpUcjX3AnJqeX3eUP0Qx0Z1Zcfl-ycn5-2UaB79dPl_ms_L53xFfeeLcCIsrq6_p9Kceh0Eqo5GQBi3mnxWWQP6_rLnH1O3Q88lRj6qlNTia_Xj48T9FaAdtIhMAAA */\\n:where(button) {\\n all: unset;\\n}\\n#zylem-editor-container {\\n position: fixed;\\n bottom: 0;\\n left: 0;\\n width: 100%;\\n height: 100%;\\n z-index: 1;\\n pointer-events: none;\\n}\\n#zylem-editor-toggle {\\n width: var(--zylem-size-icon-lg);\\n height: var(--zylem-size-icon-lg);\\n background-image: var(--zylem-logo-url);\\n background-size: contain;\\n background-repeat: no-repeat;\\n background-position: center;\\n cursor: grab;\\n z-index: 1;\\n pointer-events: auto;\\n filter: drop-shadow(0 0 10px rgba(97, 166, 232, 0.35));\\n}\\n.zylem-exo-2 {\\n font-family: var(--zylem-font-family);\\n font-optical-sizing: auto;\\n font-weight: 400;\\n font-style: normal;\\n}\\n.scrollable-y {\\n overflow-y: scroll;\\n overflow-x: hidden;\\n scroll-behavior: smooth;\\n}\\n.scroll-thin {\\n scrollbar-width: thin;\\n scrollbar-color: rgba(97, 166, 232, 0.55) rgba(10, 20, 30, 0.5);\\n}\\n.scroll-thin::-webkit-scrollbar {\\n width: 6px;\\n height: 6px;\\n}\\n.scroll-thin::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.scroll-thin::-webkit-scrollbar-thumb {\\n border-radius: 999px;\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(220, 242, 255, 0.4),\\n rgba(97, 166, 232, 0.65) 42%,\\n rgba(19, 62, 102, 0.9));\\n}\\n.scroll-thin::-webkit-scrollbar-thumb:hover {\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(240, 250, 255, 0.6),\\n rgba(97, 166, 232, 0.9) 42%,\\n rgba(21, 76, 130, 0.98));\\n}\\n.zylem-icon {\\n width: 18px;\\n height: 18px;\\n stroke: currentColor;\\n filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.55));\\n}\\n.floating-panel {\\n border-radius: var(--zylem-radius-window);\\n border: 1px solid rgba(146, 205, 255, 0.54);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: var(--zylem-effect-shadow-panel);\\n backdrop-filter: blur(var(--zylem-effect-blur-md)) saturate(1.22);\\n overflow: hidden;\\n pointer-events: auto;\\n}\\n.floating-panel-titlebar {\\n min-height: 34px;\\n box-sizing: border-box;\\n display: flex;\\n align-items: center;\\n padding: 0 var(--zylem-spacing-md);\\n background: var(--zylem-material-glossy-bar);\\n border-bottom: 1px solid rgba(5, 18, 32, 0.85);\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.62), inset 0 -1px 0 rgba(255, 255, 255, 0.08);\\n font-family: var(--zylem-font-family);\\n font-weight: 700;\\n cursor: grab;\\n user-select: none;\\n transition: filter var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.floating-panel-titlebar:hover {\\n filter: brightness(1.08);\\n}\\n.floating-panel-titlebar:active {\\n filter: brightness(0.95);\\n cursor: grabbing;\\n}\\n.floating-panel-title {\\n font-size: 13px;\\n letter-spacing: 0.02em;\\n color: #F4FAFF;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.65);\\n}\\n.floating-panel-content {\\n background: transparent;\\n}\\n.floating-panel-controls {\\n display: flex;\\n align-items: center;\\n gap: 7px;\\n}\\n.zylem-section {\\n padding: var(--zylem-spacing-sm);\\n}\\n.zylem-section-title {\\n margin: 0 0 var(--zylem-spacing-sm) 0;\\n font-size: 11px;\\n font-family: var(--zylem-font-family);\\n color: var(--zylem-color-text-secondary);\\n font-weight: 700;\\n letter-spacing: 0.09em;\\n text-transform: uppercase;\\n}\\n.entity-grid {\\n display: grid;\\n grid-template-columns: repeat(auto-fill, minmax(40px, 1fr));\\n gap: var(--zylem-spacing-xs);\\n}\\n.entity-grid > * {\\n display: flex;\\n min-width: 0;\\n aspect-ratio: 1;\\n}\\n.entity-grid-item {\\n position: relative;\\n flex: 1;\\n width: 100%;\\n height: 100%;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n background: var(--zylem-material-button-glass);\\n border: 1px solid rgba(150, 210, 255, 0.5);\\n border-radius: var(--zylem-radius-control);\\n box-shadow: var(--zylem-effect-shadow-button);\\n cursor: pointer;\\n color: var(--zylem-color-text-secondary);\\n transition:\\n background var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n border-color var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n transform var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n box-shadow var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n filter var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.entity-grid-item:hover {\\n background: var(--zylem-material-button-glass-hover);\\n border-color: rgba(150, 210, 255, 0.75);\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-glow-primary);\\n transform: translateY(-1px);\\n color: #F4FAFF;\\n}\\n.entity-grid-item:active {\\n transform: translateY(1px);\\n filter: brightness(0.92);\\n box-shadow:\\n inset 0 1px 0 rgba(255, 255, 255, 0.22),\\n inset 0 -1px 0 rgba(255, 255, 255, 0.55),\\n inset 0 2px 3px rgba(0, 0, 0, 0.28),\\n 0 1px 3px rgba(0, 0, 0, 0.28);\\n}\\n.entity-grid-item:focus-visible {\\n outline: none;\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-focus-ring);\\n}\\n.entity-icon {\\n width: 20px;\\n height: 20px;\\n color: currentColor;\\n position: relative;\\n z-index: 1;\\n filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.55));\\n}\\n.entity-grid-item:hover .entity-icon {\\n color: #F4FAFF;\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .floating-panel {\\n background: var(--zylem-color-surface);\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/global/accordion.css.ts.vanilla.css?source=#H4sIAAAAAAAAE51U227bMAx9z1cQGIa2QBU46dp1ytM2ID-x7UG2aFurLBoSnTgZ-u-DHKe51E7XPcXhTeeQh5xuNxYrobKMvDbk4M8EICNLXsJK-WshdgGdSTC2fLOYAGgTaqs2EnKLbTTEX6GNx4wNORlLNJWLnhJNUbKEWZJ8jP8r48Teliwmz5Ppy-OiRKXRdxhqCmZXKrDJnjYxlanucgC2wjiNrYTZAJqTkoaxOivo0So2K4ypKXmNXqTETJWEWd1CIGs0-CJV118-38Ls4eEW5nfzW0im8_l72Z-xBQiZJ2tT5cXaaC4lOHI4gFlaFVhkpbG6g38GdCTrh1asBLa1chr1ry7z1YtcGrdH3Xfw0lDYm6Lop5JSK4LZGlfIA6KuBX3t_ZSPatdK6y7hWE-hVplxhQjVzaC90sOd_t0ENvlGZOQYHUuICShS5DVix0pZU-yaESRk6Bh9NBeqHkVwEMK-sQCpyp4KT43TEtgrF2rl0fHin9YjJ8ciV5Wxm9O4I8chMJgtDoRF8yFo3U_nIelkZJEZ_Z6EhGSa3GHVoWt8iPBqMnvu1LA1Dg_kOkL9NhyInkCoKLpFrgLfDDlQBRTURL5DapElrfaaOerk4FYljyNFhtT8ZrXZbkf7IX1Yflp-XS5HQOaUNUGsTDCpxYPAS6VpfToRzHPMWOwSvHHFOeRekF2RSD23tBYbCaphurxsp-PYOSCZ3gWIPR5BLlXOfX9fVuHq5_z-2_erxeixuyhcETAjp5V_pcxZUrfnMLvvnHw1pA1HvlL2f2RzNvFjmi8vSvDEivF69phoLMamXSuH9mQs7zjbo9eiv0sXb1of89aZeP4LTV41nXwHAAA */\\n.zylem-accordion {\\n color: var(--zylem-color-text);\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n min-height: 0;\\n}\\n.accordion-header {\\n position: sticky;\\n top: 0;\\n z-index: 1;\\n display: flex;\\n}\\n.accordion-item {\\n position: relative;\\n border-bottom: 1px solid rgba(97, 166, 232, 0.22);\\n display: flex;\\n flex-direction: column;\\n min-height: 0;\\n scrollbar-width: none;\\n}\\n.accordion-item:last-child {\\n border-bottom: none;\\n}\\n.accordion-item[data-expanded] {\\n scrollbar-width: thin;\\n flex: 1;\\n min-height: 0;\\n}\\n.accordion-trigger {\\n box-sizing: border-box;\\n width: 100%;\\n flex: 1;\\n padding: var(--zylem-spacing-sm) var(--zylem-spacing-md);\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n gap: var(--zylem-spacing-sm);\\n border: none;\\n background: transparent;\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n font-size: var(--zylem-font-size);\\n font-weight: 600;\\n letter-spacing: 0.03em;\\n cursor: pointer;\\n outline: none;\\n transition: background var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.accordion-trigger:hover {\\n background: rgba(97, 166, 232, 0.08);\\n}\\n.accordion-trigger[data-expanded] {\\n background: rgba(97, 166, 232, 0.12);\\n color: #F4FAFF;\\n}\\n.accordion-trigger:focus-visible {\\n box-shadow: var(--zylem-effect-focus-ring);\\n}\\n.accordion-content {\\n overflow-y: auto;\\n flex: 1;\\n min-height: 0;\\n transition: height 0.3s ease;\\n}\\n.accordion-trigger::after {\\n content: \\\"\\\\25bc\\\";\\n position: relative;\\n color: var(--zylem-color-text-secondary);\\n font-size: 10px;\\n transition: transform var(--zylem-motion-normal) var(--zylem-motion-ease-out);\\n}\\n.accordion-trigger[data-expanded]::after {\\n transform: rotate(180deg);\\n color: #F4FAFF;\\n}\\n.panel-content {\\n display: flex;\\n flex-direction: column;\\n gap: var(--zylem-spacing-md);\\n padding: var(--zylem-spacing-md);\\n color: var(--zylem-color-text);\\n}\\n\\n/* vanilla-extract-css-ns:src/global/menu.css.ts.vanilla.css?source=Lnp5bGVtLW1lbnUgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBoZWlnaHQ6IDEwMCU7CiAgd2lkdGg6IDEwMCU7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tenlsZW0tcmFkaXVzLXBhbmVsKTsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIG92ZXJmbG93LXk6IGF1dG87CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogIGZvbnQtZmFtaWx5OiB2YXIoLS16eWxlbS1mb250LWZhbWlseSk7Cn0KLnp5bGVtLW1lbnU6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICBkaXNwbGF5OiBub25lOwp9Ci56eWxlbS1tZW51LWhlYWRlciB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBnYXA6IHZhcigtLXp5bGVtLXNwYWNpbmctc20pOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDk3LCAxNjYsIDIzMiwgMC4yOCk7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMzAsIDE4MCwgMjMwLCAwLjE0KSwgcmdiYSgzMCwgNjAsIDk1LCAwLjE4KSA1MCUsIHJnYmEoOCwgMjIsIDM4LCAwLjI0KSk7CiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuMTUpOwp9Ci56eWxlbS1jb2xsYXBzZS1idXR0b24gewogIGZsZXgtc2hyaW5rOiAwOwogIHBhZGRpbmc6IHZhcigtLXp5bGVtLXNwYWNpbmctc20pOwogIGZvbnQtc2l6ZTogMTJweDsKICBsaW5lLWhlaWdodDogMTsKICBtYXJnaW4tcmlnaHQ6IHZhcigtLXp5bGVtLXNwYWNpbmctc20pOwogIGNvbG9yOiB2YXIoLS16eWxlbS1jb2xvci1wcmltYXJ5KTsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KLnp5bGVtLW1lbnUgaDMsIC56eWxlbS1tZW51IGg0IHsKICBtYXJnaW46IDA7Cn0 */\\n.zylem-menu {\\n display: flex;\\n flex-direction: column;\\n height: 100%;\\n width: 100%;\\n background: transparent;\\n border-radius: var(--zylem-radius-panel);\\n box-sizing: border-box;\\n overflow-y: auto;\\n overflow-x: hidden;\\n pointer-events: auto;\\n font-family: var(--zylem-font-family);\\n}\\n.zylem-menu::-webkit-scrollbar {\\n display: none;\\n}\\n.zylem-menu-header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--zylem-spacing-sm);\\n border-bottom: 1px solid rgba(97, 166, 232, 0.28);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(130, 180, 230, 0.14),\\n rgba(30, 60, 95, 0.18) 50%,\\n rgba(8, 22, 38, 0.24));\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15);\\n}\\n.zylem-collapse-button {\\n flex-shrink: 0;\\n padding: var(--zylem-spacing-sm);\\n font-size: 12px;\\n line-height: 1;\\n margin-right: var(--zylem-spacing-sm);\\n color: var(--zylem-color-primary);\\n cursor: pointer;\\n}\\n.zylem-menu h3,\\n.zylem-menu h4 {\\n margin: 0;\\n}\\n\\n/* vanilla-extract-css-ns:src/global/entities.css.ts.vanilla.css?source=#H4sIAAAAAAAAE7VUwY6bMBC95ytG6iVIGAG7pK331Ev-Y4InxFpjW7ZJSFf775XN0oRuslVbVcgYZp7Hb96MXZAOMkjyTEkf4GUFIKS3Cs8c9orGpxWkmQnpqA3SaA6tUUOvo6dDy-GIbs3Y97OinnmLrdQd60UW_eZIbq_MiZ054BDMwjZyOEghSD-tXlf8dCBH60FliQMqxWHQnkJ0FonkmclAPTs5tJbcOxhAOzhvHAdrpA7kfl25TK5zUnyYgu9TChHHAvVWYSA2pe45VHs3j4jaGSfIcajsCN4oKcB1O1x__ZxDtdnkUD_UOZTFQ51d0MyhkINf7j7ZWItuUnCH7XPnzKDFEtdjICdRsU6h98yiJsUEuue3DUbmDyjMiYOM8kCZqJUTrbpp8nmURfkly6GERztCVdtxgpR5eoq6SQEtCiF192Gxe3Sd1HchUKZeMjqwE8nuEDhsymRrjYplu16XTCzQGFLo4FB7OXXfRZGlICa6mTauR5XdchF6YmYIWT4XIO3yL1Fmlf82xr3mLg7xlJCAa2e--PsJebk01JuQqYBVU-ZQV_HVNLH3Nn_eGVWd5Qv-tN9TG1gXj691skd3zq4q-Gn7uP223d7LimMb5JHg3aG8Qb-eiW_K_0F-YrLUX-_NR_fE7Xugl5q1RgfSAXoc5-_f3yyvPwDWLyn3egUAAA */\\n.entities-list {\\n display: flex;\\n flex-direction: column;\\n gap: var(--zylem-spacing-md);\\n overflow-y: auto;\\n overflow-x: hidden;\\n}\\n:where(ul) {\\n all: unset;\\n}\\n.entity-item-wrapper {\\n all: unset;\\n cursor: pointer;\\n}\\n.entity-item {\\n display: grid;\\n gap: var(--zylem-spacing-sm);\\n grid-template-columns: 1fr 1fr 1fr;\\n border: 1px solid rgba(97, 166, 232, 0.32);\\n border-radius: var(--zylem-radius-card);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08), 0 4px 12px rgba(0, 0, 0, 0.25);\\n padding: var(--zylem-spacing-md);\\n margin: var(--zylem-spacing-md) 0;\\n font-weight: 600;\\n color: var(--zylem-color-text);\\n transition:\\n background var(--zylem-motion-normal) var(--zylem-motion-ease-out),\\n border-color var(--zylem-motion-normal) var(--zylem-motion-ease-out),\\n box-shadow var(--zylem-motion-normal) var(--zylem-motion-ease-out);\\n}\\n.entity-item-wrapper.hovered .entity-item,\\n.entity-item.hovered {\\n border-color: rgba(150, 210, 255, 0.6);\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), var(--zylem-effect-glow-primary);\\n color: #F4FAFF;\\n}\\n.entity-item-wrapper:active .entity-item {\\n border-color: rgba(20, 255, 60, 0.6);\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), var(--zylem-effect-glow-active);\\n}\\n.entity-info-item {\\n display: grid;\\n grid-template-columns: min-content max-content;\\n gap: var(--zylem-spacing-sm);\\n}\\n\\n/* vanilla-extract-css-ns:src/global/detached-panel.css.ts.vanilla.css?source=#H4sIAAAAAAAAE61WwW7jNhC9-ysG6MVCRUNyYq-jXLaXAL31D4IROZK5oUiVHMV2ivx7QUpO7MTZ1kVhCzaGj-Rw3psnfn-iQ-OxowCKGOWWlOjRknlU3vW_W6UlsvN_DCbQ4-OfRbf_URbw1wyg8a5LfwBcj1LzoYJisb6fAbzOANh9HCzHodfZ4nynhOu0FTuteFvBclX0-_sptiXdbrmC8hjsXdCsna2g0XtSMaR06A0eKmgMJUz8FUp7kiNSOjN0No7UzivywqPSQ6jgGf1ciJeDoW6KjSll79gKyn4PwRmtwLc1zu--5VCu1zksb5Y5FIubzYhG-dR6N1h1vmyHTF6jEa3BMC0vFPqnaY-9CFtUbnc-i5qGJE9DpzmhfIrEiEYbjsnVZvDzCzNjXIQuyyAgDx6Z5uWivE2LuGfyjYlbbrVSZO8_cyJYs6EafSInZalftG2rYwVr94mim-XEECqVoMXZkULUgW1Fp1IScvDB-Qpaj_VFEtHo1grN1IUKJFkmH8M_hsC6OQjpLJPlCuK6JGriHVHiuMW-urhz6NLOQyAvAhmSXIF1lv4lfS6Eg6jRn4hD1I7ZdZ80ssqh3OQwCmSz-kS1toEYijStGKcsV6v8-BSL9TLL31DiS1gxak86E0v5y8Ptw28PD6kDnGXRYKfN4fw8JwPZG3A3MfitKN5iQb9QBeXEKdOe37If845PSqnI02exjuf8WkkVStbPlAR1Sn6tbXtp3kTwKMATdtijDT16snzs9clb3nWNA7urnOF1tkApnVfajZoTQnlsW23blMCJw60-oCNOtFsXxlT_Px3_V0cZXWvZ70E5Zpokubwpcljf5bAaRZlda4eTyE4xKSSiNrKrRHe9i31soAI2_R6Wt-8ahOm7WGX5JSttjdsJhbalsYEvvEdehLYqqkmikWfpGDyQn2oBv8JdUUxr6EinoGeyHI5m8kEdro_Ljq_RpJCjX96OrfUVzWNxUUbJXCJr6swOfavtl4b3Mws-L-hY0p9mgFZ3OBbtistCsdgEIAwktBVuYNC20VYzAUb2LXIq2vcw9L3zHMA6hvlljZT9PstSFS9dIv6pmGHwDUrKpovI3zJ_FZ_8CAAA */\\n@keyframes detached-panel_dropIndicatorPulse__q0mxj10 {\\n from {\\n opacity: 0.6;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n.detached-panel {\\n min-width: 250px;\\n min-height: 150px;\\n position: fixed;\\n display: flex;\\n flex-direction: column;\\n border-radius: var(--zylem-radius-panel);\\n border: 1px solid rgba(97, 166, 232, 0.38);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: var(--zylem-effect-shadow-panel);\\n backdrop-filter: blur(var(--zylem-effect-blur-sm)) saturate(1.14);\\n overflow: hidden;\\n}\\n.detached-panel-titlebar {\\n box-sizing: border-box;\\n min-height: 32px;\\n padding: 0 var(--zylem-spacing-md);\\n cursor: grab;\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--zylem-spacing-sm);\\n user-select: none;\\n background: var(--zylem-material-glossy-bar);\\n border-bottom: 1px solid rgba(5, 18, 32, 0.85);\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.62), inset 0 -1px 0 rgba(255, 255, 255, 0.08);\\n color: #F4FAFF;\\n font-family: var(--zylem-font-family);\\n font-weight: 700;\\n font-size: 12px;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.65);\\n}\\n.detached-panel-titlebar:active {\\n cursor: grabbing;\\n}\\n.detached-panel-content {\\n background: transparent;\\n flex: 1;\\n overflow: auto;\\n display: flex;\\n flex-direction: column;\\n}\\n.accordion-item--dragging {\\n opacity: 0.5;\\n}\\n.accordion-drag-ghost {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n background: var(--zylem-material-glass-panel-dark);\\n border: 2px dotted rgba(230, 69, 52, 0.8);\\n border-radius: var(--zylem-radius-panel);\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n backdrop-filter: blur(var(--zylem-effect-blur-sm));\\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5), var(--zylem-effect-glow-danger);\\n position: fixed;\\n z-index: calc(var(--zylem-layer-panel) + 900);\\n pointer-events: none;\\n}\\n.accordion-drop-indicator {\\n height: 4px;\\n background: var(--zylem-color-accent);\\n border-radius: 2px;\\n margin: var(--zylem-spacing-sm) var(--zylem-spacing-md);\\n box-shadow: 0 0 8px var(--zylem-color-accent);\\n animation: detached-panel_dropIndicatorPulse__q0mxj10 0.8s ease-in-out infinite alternate;\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .detached-panel {\\n background: var(--zylem-color-surface);\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/components/shared/field.css.ts.vanilla.css?source=#H4sIAAAAAAAAE51U0Y7aMBB85yv8CBKLgFPp1XzKqQ8bexOsc7yRvSmB6v69igOFAKK9e4q0Ox7veGeyOB481VA68lb9nihVcAfJHV2otCo4WopQcLedKFW7ADty1U60Wr82uXZCRLSuTVr9wjgFGCiHGhgOEtnPLmitVk2nEntnVawKnP74PlerzWau1i_ruVouXtYDGs17FbkNdkxco1B06IehofKY0om-g7RDy_vxASpLMnJqgQuJJOMNe45jaC6BUDcgSg4CJdbOH8a4q8YFmNyRHsD6cgY1aG1-1-UIlBo0LlSQ6oziVrwLpFXgQH1BIobkxHHQVxLHT8J9G0pMMnvUIEwE3Mpsft5YFvo1ju3kY7K4so0u2bRpru5rsHeyc-Hiq_9czvwRYmCMLlRXXoLTDh_6aHM_qm48GtqxtxTzWE89AIkMB4vxcMf0Zl3CwpP9ORb-ZlEQ_jbzHdwvWA5aLRffsu_amPpLAwug97wne0sPHgvy-bR1qfF40KrwbN5vzLZaDTn0JELxbKX-puUr1dk9vY5soZJjrVXbNBQNJvpnAkbqP5GFGmPlAhQswrV-aPWuGxLbpn5o8mTk7Pebd6AYedjUlWqD3kwf50yBWjfd83ijMRQ-GfCTKOHmmaKb4SOzjHdYesr76r9gXSQz5Nqwb-tw_svunZWdVsvt5OMPYeqBk6AFAAA */\\n.zylem-field {\\n box-sizing: border-box;\\n min-height: 28px;\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(97, 166, 232, 0.32);\\n background: var(--zylem-material-field-glass);\\n box-shadow: var(--zylem-effect-shadow-inset);\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n font-size: var(--zylem-font-size);\\n padding: 0 var(--zylem-spacing-sm);\\n outline: none;\\n transition: box-shadow var(--zylem-motion-fast) var(--zylem-motion-ease-out), border-color var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-field:focus,\\n.zylem-field:focus-within {\\n box-shadow: var(--zylem-effect-shadow-inset), var(--zylem-effect-focus-ring);\\n border-color: rgba(97, 166, 232, 0.6);\\n}\\n.zylem-field::placeholder {\\n color: var(--zylem-color-text-secondary);\\n}\\n.zylem-field[disabled],\\n.zylem-field[data-disabled] {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n.zylem-field-label {\\n display: block;\\n font-size: 11px;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n color: var(--zylem-color-text-secondary);\\n font-family: var(--zylem-font-family);\\n margin-bottom: var(--zylem-spacing-xxs);\\n user-select: none;\\n}\\n.zylem-field-error {\\n font-size: calc(var(--zylem-font-size) - 2px);\\n color: var(--zylem-color-accent);\\n font-family: var(--zylem-font-family);\\n margin-top: var(--zylem-spacing-xxs);\\n}\\n.zylem-field-root {\\n display: flex;\\n flex-direction: column;\\n min-width: 0;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Button/Button.css.ts.vanilla.css?source=#H4sIAAAAAAAAE7VXTY_aMBC976-wthdQ4ygJG2Cz2kMv_Ieq6sEkk-DWsSPb4WOr_vfKTggBvGygrBAIecYz7_mNx7b_tmNQ4mWtteDozwNCS7HFir5RXiRoKWQGEi_F9uUBoYyqipFdgihnlAPOGdhxwmjBMdVQqgSlwDVIM_yrVprmO5wKroHrvqkgVYLWRI4wbvKriqSUF3irxsZeUo5XQIuVTlA0r2yWimSZBRU4Z5aZnZnWUgmZoErQfbJagcQKGKQ6QVxwMIObFdVgJ4MZ3EhSvVjylrAkGa3VMcRmrF2p8cE5QWG1RUowmiFZLMkojAMPRaH5iWMPBX4cN9AEM8i-LJ4W3xYLG4Ckvwspap4dpyqJBkkJa5PhghGl2pRbrFYkE5vjGZDnkOrW1MeoYau7GYGFar4WaODZjz-LrGsuuMY5KSnbHQfvGQ6Oir6Bw80MH5w2rYbTILBgJOGKaip40vzPhSyPmQtjxTlReuwyAFGARa3HXm8pbo2QU6ZB3py_E--2CC8Pfx_8_u5LVmINMuFCj35kVJElg-znuNmT1xQKtnGuLxfP5VIwscGVpCWRjfidbq2EjGj4PsJhtXUW-SlHkmq6BidJd-R94EasBC2lKSkOSo0C_zk6o0m5At1WetDUudmG-2_gR9HY67zwu25x3HOLqi2anG6baD722kQu2zn3XKS1wmuq6JKBpSxqbTrpoS39v2BNEkl5cY7gsOIeOjEQTXBnbbCZxqp3CQr8p7jfWrnQmDAmNpA5MphAayIp4fr1sS2cx5_tyWKba1siTa-czU2vfO565Xx8dWPs6n0glgv7zFFkoR84tDyJ3VT1-zSj_WEwDQzJ2S0smxz33NZdxGHk7tafPpHJOxKGH5LMCC9AXlDQqBdOIg-F4dPNGjZZ7sm8iziM3t00_EQmN2tYrITSRxKe3c2eZx4Kp1MPRUbKwJ_EZyras6ciErg-Zbfv0m1h9JnYoeODsn_zamYOgj9QIied8Pw8HHKmD-DjhG4ue6-PqmzX_OjWHg26tavy9EaZEpaO3NdKhM1BfBkMKxxgJtNBYFhxDZivKPwIDE0Fd61N-6IxYxua6ZXjkXPhcfTxG8W8uKRgBtw_gfgEZuANAAA */\\n.zylem-button {\\n box-sizing: border-box;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: var(--zylem-spacing-xs);\\n min-height: 28px;\\n padding: 0 var(--zylem-spacing-md);\\n cursor: pointer;\\n user-select: none;\\n white-space: nowrap;\\n border-radius: var(--zylem-radius-button);\\n border: 1px solid rgba(150, 210, 255, 0.55);\\n color: #F4FAFF;\\n background: var(--zylem-material-button-glass);\\n box-shadow: var(--zylem-effect-shadow-button);\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.72);\\n font-family: var(--zylem-font-family);\\n font-size: var(--zylem-font-size);\\n font-weight: 600;\\n transition:\\n transform var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n box-shadow var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n filter var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n background var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-button:hover:not([disabled]) {\\n background: var(--zylem-material-button-glass-hover);\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-glow-primary);\\n transform: translateY(-1px);\\n color: #F4FAFF;\\n}\\n.zylem-button:active:not([disabled]) {\\n transform: translateY(1px);\\n filter: brightness(0.92);\\n box-shadow:\\n inset 0 1px 0 rgba(255, 255, 255, 0.22),\\n inset 0 -1px 0 rgba(255, 255, 255, 0.55),\\n inset 0 2px 3px rgba(0, 0, 0, 0.28),\\n 0 1px 3px rgba(0, 0, 0, 0.28);\\n}\\n.zylem-button:focus-visible {\\n outline: none;\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-focus-ring);\\n}\\n.zylem-button[disabled],\\n.zylem-button[data-disabled] {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n.zylem-button[data-variant=primary] {\\n border-color: rgba(178, 219, 255, 0.8);\\n background: var(--zylem-material-button-glass-hover);\\n}\\n.zylem-button[data-variant=primary]:hover:not([disabled]) {\\n filter: brightness(1.08);\\n}\\n.zylem-button[data-variant=active] {\\n border-color: rgba(20, 255, 60, 0.78);\\n background: var(--zylem-material-button-glass-active);\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-glow-active);\\n}\\n.zylem-button[data-variant=active]:hover:not([disabled]) {\\n background: var(--zylem-material-button-glass-active);\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-glow-active);\\n filter: brightness(1.1);\\n}\\n.zylem-button[data-variant=danger] {\\n border-color: rgba(255, 132, 114, 0.78);\\n background: var(--zylem-material-button-glass-danger);\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-glow-danger);\\n}\\n.zylem-button[data-variant=danger]:hover:not([disabled]) {\\n background: var(--zylem-material-button-glass-danger);\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-glow-danger);\\n filter: brightness(1.1);\\n}\\n.zylem-button[data-variant=ghost] {\\n border: 1px solid rgba(97, 166, 232, 0.35);\\n background: transparent;\\n box-shadow: none;\\n color: var(--zylem-color-primary);\\n text-shadow: none;\\n}\\n.zylem-button[data-variant=ghost]:hover:not([disabled]) {\\n background: rgba(97, 166, 232, 0.12);\\n box-shadow: var(--zylem-effect-glow-primary);\\n color: var(--zylem-color-primary);\\n}\\n.zylem-button[data-size=sm] {\\n min-height: 22px;\\n padding: 0 var(--zylem-spacing-sm);\\n font-size: calc(var(--zylem-font-size) - 2px);\\n}\\n.zylem-button[data-size=lg] {\\n min-height: 36px;\\n padding: 0 var(--zylem-spacing-lg);\\n font-size: calc(var(--zylem-font-size) + 1px);\\n}\\n.zylem-button[data-size=icon] {\\n min-height: 28px;\\n min-width: 28px;\\n padding: var(--zylem-spacing-xs);\\n border-radius: var(--zylem-radius-control);\\n}\\n\\n/* vanilla-extract-css-ns:src/components/ToolbarButton/ToolbarButton.css.ts.vanilla.css?source=#H4sIAAAAAAAAE61VzY6bMBC-5yks9RIkjEh22absseq-Q1XtwcBApmtsZA-BbNV3r2yTv4YcNlpFRDA_38w34xkn73sJLSetZSEML0ixPwvGCj1yi--ompwV2lRgeKHH5wVjFdpOin3OUElUwGsJXi4kNoojQWtzVoIiME78u7eE9Z6XWhEoOlc1osvZTpgl5yEJ24kSVcNHGzl9i4oPWNE2Zw-PnQ-yBWy2dPruRFX5HNNZINt6oFor4rVoUe4vA54pToYW3yFnpZDl8srW6SLG2aobTw7DlNRTmjrZsEUCnwLkTOnBiM6JCUbidisqPbh0V93oH9MUYpnG_pc8edCyN1abnHUaD6WaWmBEhb295BBkvr5Gy-hknXt8qyVWIcoqS2O2Xrm_LItZmmTBWpRvjdG9qi6BW0FgUEhe9ERa8UYKayf88cjk3APqGsoDycktMNLSEfryY_Py-PLiq2GEskioVR7ea23ay_DaaXktLEVzChAWuO4pis_yuRehRklg7o5_rOB9CM-Lv4vkag7zrd6BCdP4kRZx7_fxRsVzJo3UA-8MtsKEETk2a-qbFAQ_lzwMxCwNURLuwPOYdz4Ok29Czgrj5kmBtcs0-ba-YoLKAk0jlIaj7Q704UmT9TqKj1b8plmWnZmtu5E9_D-P600UT4HmdDcI17rsLd-hxUIG3rontyvdOlDwOY0JQQyq5kYavypBgluQUBJUrzG7NkkO2mnl-x0zzWqo12FXPKVuX3zdfHxh8ND-zzyOR8R52mhFIaF6DZV3NwHtc5Ymj9n5clWauJBSD1DNAzG7azzEdAWtNpdX0OHbktFv7sLojQFF3135zk9zZXQ3UVveWPtZFjk2_wAl4u8HiwcAAA */\\n.zylem-toolbar-btn {\\n box-sizing: border-box;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: var(--zylem-spacing-xs);\\n min-width: 34px;\\n height: 34px;\\n padding: 0 var(--zylem-spacing-sm);\\n font-family: var(--zylem-font-family);\\n font-size: calc(var(--zylem-font-size) - 1px);\\n font-weight: 600;\\n white-space: nowrap;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.6);\\n cursor: pointer;\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(150, 210, 255, 0.5);\\n background: var(--zylem-material-button-glass);\\n box-shadow: var(--zylem-effect-shadow-button);\\n color: #E8F4FF;\\n transition:\\n transform var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n box-shadow var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n filter var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n background var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-toolbar-btn:hover {\\n background: var(--zylem-material-button-glass-hover);\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-glow-primary);\\n transform: translateY(-1px);\\n}\\n.zylem-toolbar-btn:active {\\n transform: translateY(1px);\\n filter: brightness(0.92);\\n box-shadow:\\n inset 0 1px 0 rgba(255, 255, 255, 0.22),\\n inset 0 -1px 0 rgba(255, 255, 255, 0.55),\\n inset 0 2px 3px rgba(0, 0, 0, 0.28),\\n 0 1px 3px rgba(0, 0, 0, 0.28);\\n}\\n.zylem-toolbar-btn:focus-visible {\\n outline: none;\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-focus-ring);\\n}\\n.zylem-toolbar-btn[data-selected],\\n.zylem-toolbar-btn.selected {\\n border-color: rgba(20, 255, 60, 0.78);\\n background: var(--zylem-material-button-glass-active);\\n box-shadow: var(--zylem-effect-shadow-button), var(--zylem-effect-glow-active);\\n}\\n.zylem-toolbar-btn[disabled] {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n.zylem-toolbar-btn svg {\\n width: 18px;\\n height: 18px;\\n stroke: currentColor;\\n filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.55));\\n}\\n\\n/* vanilla-extract-css-ns:src/components/TextField/TextField.css.ts.vanilla.css?source=Lnp5bGVtLXRleHRmaWVsZC1pbnB1dCB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAyOHB4Owp9Ci56eWxlbS10ZXh0ZmllbGQtdGV4dGFyZWEgewogIHdpZHRoOiAxMDAlOwogIG1pbi1oZWlnaHQ6IDcycHg7CiAgcGFkZGluZzogdmFyKC0tenlsZW0tc3BhY2luZy1zbSk7CiAgcmVzaXplOiB2ZXJ0aWNhbDsKICBsaW5lLWhlaWdodDogMS40NTsKfQ */\\n.zylem-textfield-input {\\n width: 100%;\\n height: 28px;\\n}\\n.zylem-textfield-textarea {\\n width: 100%;\\n min-height: 72px;\\n padding: var(--zylem-spacing-sm);\\n resize: vertical;\\n line-height: 1.45;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/NumberField/NumberField.css.ts.vanilla.css?source=Lnp5bGVtLW51bWJlcmZpZWxkLWdyb3VwIHsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgd2lkdGg6IDEwMCU7Cn0KLnp5bGVtLW51bWJlcmZpZWxkLWlucHV0IHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDI4cHg7CiAgcGFkZGluZy1yaWdodDogMjZweDsKICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwp9Ci56eWxlbS1udW1iZXJmaWVsZC1zdGVwcGVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDNweDsKICB3aWR0aDogMjBweDsKICBoZWlnaHQ6IDExcHg7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIGN1cnNvcjogcG9pbnRlcjsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE1MCwgMjEwLCAyNTUsIDAuNCk7CiAgYm9yZGVyLXJhZGl1czogNHB4OwogIGJhY2tncm91bmQ6IHZhcigtLXp5bGVtLW1hdGVyaWFsLWJ1dHRvbi1nbGFzcyk7CiAgY29sb3I6ICNGNEZBRkY7CiAgZm9udC1zaXplOiA4cHg7CiAgbGluZS1oZWlnaHQ6IDE7CiAgcGFkZGluZzogMDsKICB0cmFuc2l0aW9uOiBmaWx0ZXIgdmFyKC0tenlsZW0tbW90aW9uLWZhc3QpIHZhcigtLXp5bGVtLW1vdGlvbi1lYXNlLW91dCk7Cn0KLnp5bGVtLW51bWJlcmZpZWxkLXN0ZXBwZXI6aG92ZXIgewogIGZpbHRlcjogYnJpZ2h0bmVzcygxLjI1KTsKfQouenlsZW0tbnVtYmVyZmllbGQtc3RlcHBlcjphY3RpdmUgewogIGZpbHRlcjogYnJpZ2h0bmVzcygwLjg1KTsKfQouenlsZW0tbnVtYmVyZmllbGQtc3RlcHBlci0tdXAgewogIHRvcDogM3B4Owp9Ci56eWxlbS1udW1iZXJmaWVsZC1zdGVwcGVyLS1kb3duIHsKICBib3R0b206IDNweDsKfQ */\\n.zylem-numberfield-group {\\n display: inline-flex;\\n align-items: stretch;\\n position: relative;\\n width: 100%;\\n}\\n.zylem-numberfield-input {\\n width: 100%;\\n height: 28px;\\n padding-right: 26px;\\n font-variant-numeric: tabular-nums;\\n}\\n.zylem-numberfield-stepper {\\n position: absolute;\\n right: 3px;\\n width: 20px;\\n height: 11px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n cursor: pointer;\\n border: 1px solid rgba(150, 210, 255, 0.4);\\n border-radius: 4px;\\n background: var(--zylem-material-button-glass);\\n color: #F4FAFF;\\n font-size: 8px;\\n line-height: 1;\\n padding: 0;\\n transition: filter var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-numberfield-stepper:hover {\\n filter: brightness(1.25);\\n}\\n.zylem-numberfield-stepper:active {\\n filter: brightness(0.85);\\n}\\n.zylem-numberfield-stepper--up {\\n top: 3px;\\n}\\n.zylem-numberfield-stepper--down {\\n bottom: 3px;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Select/Select.css.ts.vanilla.css?source=#H4sIAAAAAAAAE7VVTW_bMAy951cIGAbEQFUkWde16mW75E8MOzAW7XCVJUGiE6dD__sg2Wnz4bTrYbeEX--R4qOvn3YGGxnRYMmSA9U1BvFnIoSm6A3slCBryKKsDHYPEyHAUG0lMTZRiRItY0jm321kqnaydJbRshLRQ4lyhbxFtCmiBq_EBsJUygHUQ0m2lrEpkn9LmtdKzGezz-nvGqlesxKLO59xyzZEF5TwjvaYjB3LzEcJgxU_TJ4n10cNbcC0mNtxGwyVcVsl1qR1zyjnvzrQGPKRYiazJsbMEJWwbhvAn1en0tlcPM1GxnUg-6jELOVXzrKM9IRK3A_8nUn0DweQTdIHaiDs8gw4gI3E5Kzqf1cuNEc5jUteWUHkYsyBEFG6lotzusPr_tTAILHzYDXqX-JCTy_wSgTHwDid38001iOFhzfPaU-SrMbuuFEDOwyyQdvmLlcuaAwygKY2Hkf2tlwxOHMQrcTcdyI6Q1qEegXT-29XYn57eyUWXxZXYnZ987WPhvKxDq61-rhwA4yBwMjaQIzSg0UjNYTHASO9H-i0BodZWFWpwd7VJ72g6OC8rMhwIrcybZiOZCa7bHRRiAjchjzG68UiFzlfydPBGoq8cl0ebAOdfNXErF-qfQm5UwJadsnmQWuy9bjWupihGwg12WFXX5S-l3heZ00By34TS2fa5lXDiwG75XQYkjwsjoiDsTk-JP_9grzX-Vu5Jzt5845o0-koXoReQUNmdxx34ChOLsJZWDIXF45cGzEMM92P-p9m38t8TfXapKVJSv9zoo9RHQ3LOXT-aXmz_LFcvgXRG8bqj-pv1TI728vwA9rr0z5ITVOEldlTc-nFeafysTictnXpM2LcFvV4tXTTqAR2_afx4lZAybTB0-eez9MyPU--x9Z7FzgmQDEdvyFz3xVFRrl8Yy9PuacR21BB2fN4njz_BdQ7x3TkBwAA */\\n.zylem-select-trigger {\\n display: inline-flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--zylem-spacing-sm);\\n width: 100%;\\n height: 28px;\\n cursor: pointer;\\n text-align: left;\\n}\\n.zylem-select-value {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.zylem-select-icon {\\n flex-shrink: 0;\\n font-size: 9px;\\n color: var(--zylem-color-primary);\\n transition: transform var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-select-trigger[data-expanded] .zylem-select-icon {\\n transform: rotate(180deg);\\n}\\n.zylem-select-content {\\n z-index: var(--zylem-layer-menu);\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(97, 166, 232, 0.45);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: var(--zylem-effect-shadow-panel);\\n backdrop-filter: blur(var(--zylem-effect-blur-md)) saturate(1.22);\\n overflow: hidden;\\n}\\n.zylem-select-listbox {\\n max-height: 280px;\\n overflow-y: auto;\\n padding: var(--zylem-spacing-xs);\\n margin: 0;\\n display: flex;\\n flex-direction: column;\\n gap: 2px;\\n outline: none;\\n}\\n.zylem-select-item {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--zylem-spacing-sm);\\n padding: var(--zylem-spacing-xs) var(--zylem-spacing-sm);\\n border-radius: 4px;\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n font-size: var(--zylem-font-size);\\n cursor: pointer;\\n user-select: none;\\n outline: none;\\n}\\n.zylem-select-item[data-highlighted] {\\n background: rgba(97, 166, 232, 0.22);\\n color: #F4FAFF;\\n}\\n.zylem-select-item[data-selected] {\\n background: var(--zylem-material-button-glass);\\n box-shadow: var(--zylem-effect-shadow-button);\\n color: #F4FAFF;\\n}\\n.zylem-select-item[data-disabled] {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n.zylem-select-item-indicator {\\n color: var(--zylem-color-active);\\n font-size: 11px;\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .zylem-select-content {\\n background: var(--zylem-color-surface);\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Checkbox/Checkbox.css.ts.vanilla.css?source=#H4sIAAAAAAAAE6VUwW7bMAy95ysE7JIAVpCkS7qpp13yE8MOikXbbGXRkOg66bB_HyQ7q9M6LdrBcQCR1OMjH-nl08lCLfMK8ocDHaUnYvF7JoTB0Fh9UgKdRQeysHC8mwmhLZZOIkMdlMjBMfhoLnWjxKP2cyl7xNDoHF0pQ72I_rz1gbwSDeH5ShvAywAWclbCkYO72Z_ZcoLPT6NZS4NBHyyYX4keRXg-KbFabsf4jlhqa6kDMwWHrmn7-hoKyEhOCX0IZFuGCNOh4UqJdZNqrQDLiv8dG20MulKJVTzV2pfolJCDlx7BF5Y6JSo0BlxiZbFRwkPO81Umhl_qR1chQ2oSRNKd1000H8gb8CnDa_I5OfZkL-V5R5f7NjAWp3QXHI9d51q_vSh2OPdUpNcG23CpbW8781mMia-bowhk0QhfHvT8-20m1rtdJjY3myxq1Qfr_KH01DpziVtrBo_aygLBGllaHcKAfpSh0iZ2d3wBigJyHlwSXQBO8ey1O8v7nOwyF0W3LHTgxZQDdABJLS-yUfbPI6Re5mTJfw7j2m6oKs6deGtUxslVL8t6u8rEZh3_ttuoy-2H25xNRZSWOtl4rLU_XaXcr3MyxW1-k_p7g3JomcldTMrkHL4qeLf9QMV9lusaFJS3QXbIFbp3pPjPBveZPLpykg3m5FKi825vXuz2cB5m4cv-6_7Hfh8tgT09gBzu3fQf1QItx2YaT81Abr5KrY1vauwqS89yt5gkZPUB-tILciwLXaM9XdY-ciRJ0jngE0yERfNiVMA4IJkkw_HDy_JM8irsaKb_AphJUukyBwAA */\\n.zylem-checkbox-root {\\n display: inline-flex;\\n align-items: center;\\n gap: var(--zylem-spacing-sm);\\n cursor: pointer;\\n user-select: none;\\n}\\n.zylem-checkbox-root[data-disabled] {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n.zylem-checkbox-input {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border: 0;\\n}\\n.zylem-checkbox-control {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 18px;\\n height: 18px;\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(97, 166, 232, 0.5);\\n background: var(--zylem-material-field-glass);\\n box-shadow: var(--zylem-effect-shadow-inset);\\n transition:\\n background var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n box-shadow var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n border-color var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-checkbox-root:hover .zylem-checkbox-control {\\n border-color: rgba(150, 210, 255, 0.7);\\n box-shadow: var(--zylem-effect-shadow-inset), var(--zylem-effect-glow-primary);\\n}\\n.zylem-checkbox-root[data-checked] .zylem-checkbox-control {\\n background: var(--zylem-material-button-glass);\\n border: 1px solid rgba(150, 210, 255, 0.65);\\n box-shadow: var(--zylem-effect-shadow-button);\\n}\\n.zylem-checkbox-root:focus-within .zylem-checkbox-control {\\n box-shadow: var(--zylem-effect-shadow-inset), var(--zylem-effect-focus-ring);\\n}\\n.zylem-checkbox-icon {\\n width: 12px;\\n height: 12px;\\n color: #F4FAFF;\\n stroke-width: 3.5;\\n filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.6));\\n}\\n.zylem-checkbox-label {\\n font-family: var(--zylem-font-family);\\n font-size: var(--zylem-font-size);\\n color: var(--zylem-color-text);\\n}\\n.zylem-checkbox-root:hover .zylem-checkbox-label {\\n color: var(--zylem-color-primary);\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Switch/Switch.css.ts.vanilla.css?source=#H4sIAAAAAAAAE61V246bMBB9z1f4MUh2ZEiyG9gfqVT1weABRmtsZJsl2VX_vbIhLbk0VbcVIOG5npkzI2_eTwo65kb0VcusMZ58rAiR6HolTgVBrVADqxUcX1aECIWNZuihcwWpQHuwQdyIviBvwq4Zm-P1okLdMNclQV8N1hlbkN7g2WVwYJkDBZUviDYaXlbfV5sbNF-l8IJJdKJUIL9FcCYE96eC8M1-GV0bz4RSZgR5Gwx1P0y19cahR6MLIkpn1OAhBBlR-rYgaR_rbAGb1v889kJK1E1BeDh1wjaoC8JmrXkDWyszFqRFKUFHTAr7glio_JpTMr-xF2OLHmKDIEAereiDuDRWgo0ZrqFXRntrVARfmiNz-B7BTC6sNMdFAdvDZQUZn86zsRUSB1eQPM-X8lgpcUahJLYpxTp_piR9eqIk22aU8M0ui-BLUb021gxaXvLdCQ8WhWI1gpKsUcK5ySHgbYUM3Vk6QF1D5WcVQ-3AJxedziZ4PwfxDxPordBnWn-BvMRogpppYzuhknsqEA6YGXxCF7g_G-PRPFctVK9hnB8Qveh0WEFhWRPIA-3X6YFLaOjEVPp8oCRLc0qy_T5QtU1mzZZTku8oSXeHID_sk7-mhN6zaJQZWW-xE_b0mzKL2lSDYyP6FvWjKv8Vy5THom7uIPHt0JUxz3m7d1frvfvUcoRGnz--2d1sxkO-sh2n2Z7Pzvn-zFb6xGnGOc22UX7LVewC4REMvwfkOaGzetsfJwNO47PZJ9dLEv9rY7v_N9-x3VcD_nFOG1LNWZXw8GWdHvrjnSBKlDDNRm20Z7XoUJ0uh2OhiGXFs8N3uGMWxNMVZFS4I5YGUcQ8HGMxPwCrogohCgcAAA */\\n.zylem-switch-root {\\n display: inline-flex;\\n align-items: center;\\n gap: var(--zylem-spacing-sm);\\n cursor: pointer;\\n user-select: none;\\n}\\n.zylem-switch-root[data-disabled] {\\n opacity: 0.5;\\n cursor: not-allowed;\\n}\\n.zylem-switch-input {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border: 0;\\n}\\n.zylem-switch-control {\\n box-sizing: border-box;\\n width: 38px;\\n height: 20px;\\n border-radius: 999px;\\n border: 1px solid rgba(97, 166, 232, 0.42);\\n background: var(--zylem-material-field-glass);\\n box-shadow: var(--zylem-effect-shadow-inset);\\n padding: 2px;\\n display: flex;\\n align-items: center;\\n transition: background var(--zylem-motion-normal) var(--zylem-motion-ease-out), box-shadow var(--zylem-motion-normal) var(--zylem-motion-ease-out);\\n}\\n.zylem-switch-root[data-checked] .zylem-switch-control {\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(178, 219, 255, 0.3),\\n rgba(30, 94, 148, 0.85));\\n box-shadow: var(--zylem-effect-shadow-inset), var(--zylem-effect-glow-primary);\\n}\\n.zylem-switch-root:focus-within .zylem-switch-control {\\n box-shadow: var(--zylem-effect-shadow-inset), var(--zylem-effect-focus-ring);\\n}\\n.zylem-switch-thumb {\\n width: 14px;\\n height: 14px;\\n border-radius: 999px;\\n border: 1px solid rgba(255, 255, 255, 0.4);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(240, 250, 255, 0.95),\\n rgba(160, 200, 235, 0.9));\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7), 0 1px 3px rgba(0, 0, 0, 0.5);\\n transition: transform var(--zylem-motion-normal) var(--zylem-motion-ease-out);\\n}\\n.zylem-switch-thumb[data-checked] {\\n transform: translateX(18px);\\n}\\n.zylem-switch-label {\\n font-family: var(--zylem-font-family);\\n font-size: var(--zylem-font-size);\\n color: var(--zylem-color-text);\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Slider/Slider.css.ts.vanilla.css?source=#H4sIAAAAAAAAE51VXY_rJhB931_BS6VEMpHtTbIJ96dUfRjD2KaLwYJxPm51_3sFeNs4ye7trZIoYoaBc84cYPP9anDgwWiFnnvniP31wpjSYTRwFaw1ePn2wtI_V9qjJO2sYNKZabAx08Eo2An8ivN5rRGkth2_XMI6TjhrRb1gVVn-FodTQM8DGpQkmHUWY5DcJHsO8-I5-uNl8wDudwUEXOkAjUH1R8Lq4n50Fazc7B6regSF_jkpMLqzXBMOQTCJltDH8J9TIN1euXSW0JJgkRHyBumMaB-3MNCgSTu0zhIP-jsKVlVj2sMgUSScRYkgywMOiTNeiJMHG1rnB8GmcUQvISRBpDPOL3VNIZ6qAkpnFfhrEjjt2sKgzXVZcZNYP8I-gZnwHrYEI1cPa8TcmnFWj5f1l-hGr4dfhDVPPIHXYInbaUCvpWAEzWTAx0B4BE8e5HsCP7qgs208GiB9Svr1qLueBDvkLtx5sHE-OQqUnoJgx-MxT8txwarxwoIzWjHfNbA6vhWs2u8LVr_WBSs39SHhbkC-d95NVi35DUDoNRjeajSKdwZCPgmNu_DQg3LnZQG2LUqaU1zbgJRlnnyIOo9OZ2_eq9BqY-5EgCY4M9FChJ_SviFitEXwvIuT0NKqOpQKuyILUb0dClZXx4LVu11UYr9bz6ntoWDV61vB6rqMmeP6gXIixsqkbpmr4jIfv3Kz3T2xKfXT0CzPb2OcfL9t6z7z-IfvPCY3CsZ3t739zz1fIts9NPxLneptWdS7ci4-7j9EqrZlUR3Lon5N8fp_aPQWFc_57XjJM8oifTYx9cRXnXHnxcn88FXnoYljN1Gkc3Mdx1tpNtS_6JYmdzHNWwi0fpZACMjdRJ91VMTL_pTvn1s8jbbdZyWtk1PgJx10Y3Llr0v3RJ-8rNe2-wws13ac6IuT9mHEOx_m4QhK5bs_jgbwnbaC8TnrTuhbEwn0WilMb6o0eoz3maRVPEz5mx_TXhOm1yS16-xhvDVx-e3lx98xX-CK0wcAAA */\\n.zylem-slider-root {\\n display: flex;\\n flex-direction: column;\\n gap: var(--zylem-spacing-xxs);\\n width: 100%;\\n user-select: none;\\n touch-action: none;\\n}\\n.zylem-slider-root[data-disabled] {\\n opacity: 0.5;\\n}\\n.zylem-slider-header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n}\\n.zylem-slider-label {\\n font-size: 11px;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n color: var(--zylem-color-text-secondary);\\n font-family: var(--zylem-font-family);\\n}\\n.zylem-slider-value {\\n font-size: calc(var(--zylem-font-size) - 2px);\\n color: var(--zylem-color-primary);\\n font-family: var(--zylem-font-family);\\n font-variant-numeric: tabular-nums;\\n}\\n.zylem-slider-track {\\n position: relative;\\n height: 8px;\\n width: 100%;\\n border-radius: 999px;\\n border: 1px solid rgba(97, 166, 232, 0.28);\\n background: var(--zylem-material-field-glass);\\n box-shadow: var(--zylem-effect-shadow-inset);\\n cursor: pointer;\\n}\\n.zylem-slider-fill {\\n position: absolute;\\n height: 100%;\\n border-radius: 999px;\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(178, 219, 255, 0.65),\\n rgba(48, 137, 220, 0.9));\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45);\\n}\\n.zylem-slider-thumb {\\n display: block;\\n width: 16px;\\n height: 16px;\\n top: -5px;\\n border-radius: 999px;\\n border: 1px solid rgba(255, 255, 255, 0.5);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(240, 250, 255, 0.96),\\n rgba(140, 190, 235, 0.92));\\n box-shadow:\\n inset 0 1px 0 rgba(255, 255, 255, 0.75),\\n 0 1px 4px rgba(0, 0, 0, 0.5),\\n var(--zylem-effect-glow-primary);\\n cursor: grab;\\n outline: none;\\n transition: box-shadow var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-slider-thumb:active {\\n cursor: grabbing;\\n}\\n.zylem-slider-thumb:focus-visible {\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.75), var(--zylem-effect-focus-ring);\\n}\\n.zylem-slider-thumb-input {\\n position: absolute;\\n width: 1px;\\n height: 1px;\\n padding: 0;\\n margin: -1px;\\n overflow: hidden;\\n clip: rect(0, 0, 0, 0);\\n white-space: nowrap;\\n border: 0;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Tabs/Tabs.css.ts.vanilla.css?source=#H4sIAAAAAAAAE51U22rjMBB971cIloUYrCDHG7d1n_YlP7HsgyxNHFFZMtI4ly7990WSs3GySUpLMIG5npk5OvO3g4aOIm88ddYi-fNAiFS-1_xQk7WG_csDif9UKgcClTU1EVYPnQmeThm6AdVusCYsGHZK4qYmBWPfXx7eH-aT-lr5G_W5Vq2hCqHzyUjByOBoeV-Tso9BvfUqtXegOaotRCuXUpm2JlvuZpSmdr7nQpmW7n12084u4aFTbQvuHKEyWhmgV4EKMAjuH8wbjb4MspMxt7FOgqOOSzX48wrJRpsB0Zrsnoul46RaNSn6PfFWK0lc2_DZ82NOiqrKyaJc5ITNy2njxiLaribGmrjwhovX1tnByJqE3XBH29ANDM6KJyahzVPVRZWTsshJ-RxqVtloLlhOFiwnJQvmZRZ7CautOx8umijCHqkHYY3k7hBj19YgXfNO6cN5xsRxCvTqDWoiuBaz_2KDLyM0rOOUsBvZXLG4MjE4H6D1Vh2vbQcMg59Wgo6bIzdP6znD1tngpmvuMbvmAO6B2gGzPO3ia8k3KF1v7HYk9t1FZ5-6b_mUk8cqJ0WxSJc8HniZbl5F84944auwfkmOnHrQIBDk7ym-b6sfq5-r1SWes9k5glNcjxynrebeT4k7lhoxBdZF6i2XEe1yDN1Tv-HS7sJT94CExcfBRgovl_nxY_My5SRKjkkpPHwxgeXxN69unmJtxeDpVnnVaIgjTzFMB4T1GgTSlOCUae_vUSrPG33cow0igoc6XmDKY2ORcq3tDuRlOWENgkkSHQSvJsVVib9QJHZNeAR38qoi3Xd8XqQ-YkekBe25AU0ld68f6_Gouxev_P0vMoznVioHAAA */\\n.zylem-tabs-root {\\n display: flex;\\n flex-direction: column;\\n min-height: 0;\\n width: 100%;\\n}\\n.zylem-tabs-list {\\n display: flex;\\n align-items: flex-end;\\n gap: 3px;\\n position: relative;\\n padding: var(--zylem-spacing-xs) var(--zylem-spacing-xs) 0;\\n}\\n.zylem-tabs-trigger {\\n display: inline-flex;\\n align-items: center;\\n gap: var(--zylem-spacing-xs);\\n padding: var(--zylem-spacing-xs) var(--zylem-spacing-md);\\n border-radius: var(--zylem-radius-button) var(--zylem-radius-button) 0 0;\\n border: 1px solid rgba(97, 166, 232, 0.3);\\n border-bottom: none;\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(26, 31, 39, 0.6),\\n rgba(10, 20, 30, 0.5));\\n color: var(--zylem-color-text-secondary);\\n font-family: var(--zylem-font-family);\\n font-size: calc(var(--zylem-font-size) - 1px);\\n font-weight: 600;\\n cursor: pointer;\\n outline: none;\\n transition: background var(--zylem-motion-fast) var(--zylem-motion-ease-out), color var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-tabs-trigger:hover {\\n color: var(--zylem-color-text);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(38, 76, 112, 0.5),\\n rgba(15, 39, 62, 0.45));\\n}\\n.zylem-tabs-trigger[data-selected] {\\n color: #F4FAFF;\\n background: var(--zylem-material-button-glass);\\n border-color: rgba(150, 210, 255, 0.55);\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35);\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.6);\\n}\\n.zylem-tabs-trigger:focus-visible {\\n box-shadow: var(--zylem-effect-focus-ring);\\n}\\n.zylem-tabs-trigger[data-disabled] {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n.zylem-tabs-content {\\n flex: 1;\\n min-height: 0;\\n border-radius: 0 var(--zylem-radius-card) var(--zylem-radius-card) var(--zylem-radius-card);\\n border: 1px solid rgba(97, 166, 232, 0.3);\\n background: var(--zylem-material-glass-panel-dark);\\n padding: var(--zylem-spacing-md);\\n outline: none;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Tooltip/Tooltip.css.ts.vanilla.css?source=#H4sIAAAAAAAAE31T247aMBB95yvmMUgYOSnQNvuyH9GXqqrQEE9YF8e27AkEKv69srN0SZetokj2zDlz85nnA53bgB1F-OacYe23ZJnCdlvG0y8VjITfM4A2uC4fAJzHRvO5BvmU7xzQxtaFrh6PBpm-Fys_zJP_OgNg9y-1_B9VvhKvs-XlbKgTPBaWg3gXNWtnawhkkPWREvgitFU01HDEUAgx0gyeKdzIOWaHgzhpxS81VBvph2TzqJS2-yk1pkLtXgxx_tAeuxxv54KiIAIq3cdphNEmGmc5OHOHrqH0A0RntIKw32Hx9fMCys1mAdWnagFyuVqPaGwO--B6q6aBO2QKGo3YG4xReLRkhMJweM0xiPiCyp1qkPDFD1Ct_DAmkov8pQQL0DYSg8zFyNFfrdeL2y-XZfW3DBWcF602nKrfmT4U9wVR21LDItnTXOYQkfuATEW5LMdeGmdcmLaRTYJp4IxonWXRYqfNeYq7c7wBo75QDQ2apniHTb45iNTYG-FEev_CNWxkFq0hZgq316xBLmVFXVaD00n9go5kOdZgnaWnd0r8oZBR5D35mVWJVnc4yvKjLZLLch2nL-kSQxBGEq5Pc7jOnmPvvQscwTqG4vH0U2vznPfBgnysnHHksQ8tNnTbsT_LMgUwAAQAAA */\\n@keyframes Tooltip_enter__1swjdrl0 {\\n from {\\n opacity: 0;\\n transform: translateY(4px);\\n }\\n to {\\n opacity: 1;\\n transform: translateY(0);\\n }\\n}\\n.zylem-tooltip {\\n position: relative;\\n z-index: var(--zylem-layer-tooltip);\\n max-width: 260px;\\n padding: var(--zylem-spacing-xs) var(--zylem-spacing-sm);\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(97, 166, 232, 0.45);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.12);\\n backdrop-filter: blur(var(--zylem-effect-blur-sm)) saturate(1.15);\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n font-size: calc(var(--zylem-font-size) - 1px);\\n font-weight: 600;\\n letter-spacing: 0.02em;\\n pointer-events: none;\\n}\\n.zylem-tooltip[data-enter] {\\n animation: Tooltip_enter__1swjdrl0 0.15s var(--zylem-motion-ease-out);\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .zylem-tooltip {\\n background: var(--zylem-color-surface);\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/components/DropdownMenu/DropdownMenu.css.ts.vanilla.css?source=#H4sIAAAAAAAAE51Vy27bMBC85ysI9CIBpiH5kcbKJUUD3_oBRVEEa3Els6FIgVzFcor-e0HSSqxCNoLepOXMPofLh2c8VhYadOzRmlaYg_6GuntCTWifnvIdvixMnrHfN4xV1jThgzHTQinpWLDsPvyTBe0qY5sifiog_J7wVdunHvDnhjEy_3Lza9zsRPxzM389Kmy4OKXHS6MJNQVvr1xqgX3BXsAmnEekgiNa3qDugo9Gan6QgvYFy--ytve2FoSQuh7znE9M17x3gbczVqDlFoTs3BgZbSETa9QZumB52zNnlBTM1jtINp9nLL-9nbHFcjFj2Xy1jmgon2trOi3GjhsgtBIUrxU4x1vQqLgA-3yK0XO3B2EOYxZWFZZ0Ooqktyi-bbySinxyO9XZZILp7bwRacocUGeBMMnni0VwYjpSUmPBtNF4f3kePwQQcOxb0ALFzzAe0LIBkkYX19WVzfOFGzfCeBpHcMhNR-lUYEkY9SikaxUcC1YpDOMFJet47gpWhmje_KtzJKvjkHHB_MSR75AOiNojaminNdGI9CO6mbS7ZkpPq6jE0ihjx_6CiRP2FHiV0cQraKQ6jnFnB-9AJ19xAubNAVR21vmArZFDWzqHljtUWNIw5Q-M3Xc3znwv672S9Z6GsZ-re_IWnKR1qv3TdrX9st1eDyKkg50aIrzvn_lqfV6WNsRBKXNAcckf5wJ0jTY4ekthu_l6dzGFgfLRehfLbMZuNzO2juWux-VuHzePy6lYbm8slV3cbWfjLEGVyfRMGWfL05a9KiXusDRagI1aUUjkpx4l6vuY3WIzmRO2YIFM7NcefeFhzZ1vvUE1Ddha6v-7HmdN9MoDy2t_V1BTsskE1rP4PLRgUdNsWljLdTqChb3x4Lq2NZacVwdLprdi3vZpGkq89t5c3tyx066zFZQ4vF1_AZRbEIFeBwAA */\\n@keyframes DropdownMenu_enter__1bev2o10 {\\n from {\\n opacity: 0;\\n transform: translateY(-4px);\\n }\\n to {\\n opacity: 1;\\n transform: translateY(0);\\n }\\n}\\n.zylem-dropdown-content {\\n z-index: var(--zylem-layer-menu);\\n min-width: 180px;\\n padding: var(--zylem-spacing-xs);\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(97, 166, 232, 0.45);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: var(--zylem-effect-shadow-panel);\\n backdrop-filter: blur(var(--zylem-effect-blur-md)) saturate(1.22);\\n outline: none;\\n}\\n.zylem-dropdown-content[data-expanded] {\\n animation: DropdownMenu_enter__1bev2o10 0.12s var(--zylem-motion-ease-out);\\n}\\n.zylem-dropdown-item {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--zylem-spacing-md);\\n padding: var(--zylem-spacing-xs) var(--zylem-spacing-sm);\\n border-radius: 4px;\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n font-size: var(--zylem-font-size);\\n cursor: pointer;\\n user-select: none;\\n outline: none;\\n}\\n.zylem-dropdown-item[data-highlighted] {\\n background: rgba(97, 166, 232, 0.22);\\n color: #F4FAFF;\\n}\\n.zylem-dropdown-item[data-disabled] {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n.zylem-dropdown-item--danger {\\n color: #FF9C8F;\\n}\\n.zylem-dropdown-item--danger[data-highlighted] {\\n background: rgba(230, 69, 52, 0.25);\\n color: #FFD9D3;\\n}\\n.zylem-dropdown-shortcut {\\n font-size: calc(var(--zylem-font-size) - 3px);\\n color: var(--zylem-color-text-secondary);\\n letter-spacing: 0.06em;\\n}\\n.zylem-dropdown-separator {\\n height: 1px;\\n border: none;\\n margin: var(--zylem-spacing-xs) var(--zylem-spacing-sm);\\n background:\\n linear-gradient(\\n 90deg,\\n transparent,\\n rgba(97, 166, 232, 0.35),\\n transparent);\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .zylem-dropdown-content {\\n background: var(--zylem-color-surface);\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Dialog/Dialog.css.ts.vanilla.css?source=#H4sIAAAAAAAAE61VXY-bOBR9n19xpVWloI2RyYQ0pS-z0nb-Q59GN_hC3DE2sp0Gpup_r2xImhQy7axWCAndz3PuPTYPz9RXFhty8K9EZeon85Wswv6T9mSfnt7bL_0zh293AJU1TfwAMC2W0vcF8I93AN_vALz51ZUNru93D5MWpdGetL9skb3eAsBb1K4ytimGT4WePi-2bZeAK1HRgqcftslv4Nwqw09FsuSEOn3pFTVMRMRsHEos2honvTS6gEp2JEKC1I78CPWFSS2oK-Ar2gVjQxmFPVnWGIEqdthh-Vxbc9CiAFvvcJEvIeNLyLZL4OnmHCOsaVkllSdbwE4d7OK-7aIXtWxwgPHa4nia5e4KSmNCFiN0xMzBJx8nZE8Eyb6Jb4mqXNwiDX_DMFshXauwL6BS1EUiStaaSU-NK6CkgD6Yvxycl1XPRq1culoUQur6esIuLFrXTNUzjMYikc5RCr8vIOP8XSjWYMdG03rN2whpZ6wgyywKeXDXbQYbO0otzDH5GVxA1nbgjJJiWGi23ixhxfMlrPI8LDVfTzZ_tRb0ZCUqVit0jrWoSTGB9nls0jG3R2GO11lUVVT60TUkvaKdmcxgZ41IEnDoDxY9LbJ0tYpFgqAqFVrupRCk52U3e5h5mm3eKrs9oRgl10jN9iTrvS_gtJT_LJygDGI78kcaONTYzmvHNcmVvvhsVCP-dJHGuZ7t0F7ohO2M96aZyCUfzv79Kkhlm0-WHk8c8JjGh5Sgq9PL080qWZ6j2M0wvp2ZvJde0TB4tLXU48mujPbMyRcqILsflhBNx3Ez73kMU-Q92dN4CuApX1ETPKVRxhbw1-P68Z_Hx3N-hY1U_fXULhyRu6fOn8kPtMMbGfFlfNJNPsNlZ8R4Tf_2ljgDvIyIJhbaJ28CfDGsSVgwxyAlNZ2FnaXrfIq_MsaPp2Ci-Im0g4ORFv-DqlWdvHafPrhD2xrrHWjjYTF_v2RtlyQR-u3r9_bBGSbvDrbCkk7_4R_drXA7oAgAAA */\\n@keyframes Dialog_overlayEnter__7rjyk0 {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes Dialog_contentEnter__7rjyk1 {\\n from {\\n opacity: 0;\\n transform: translateY(8px) scale(0.98);\\n }\\n to {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n }\\n}\\n.zylem-dialog-overlay {\\n position: fixed;\\n inset: 0;\\n z-index: var(--zylem-layer-modal);\\n background: rgba(5, 10, 18, 0.6);\\n backdrop-filter: blur(3px);\\n animation: Dialog_overlayEnter__7rjyk0 0.15s var(--zylem-motion-ease-out);\\n}\\n.zylem-dialog-positioner {\\n position: fixed;\\n inset: 0;\\n z-index: calc(var(--zylem-layer-modal) + 1);\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n padding: var(--zylem-spacing-lg);\\n}\\n.zylem-dialog-content {\\n width: 100%;\\n max-width: 440px;\\n border-radius: var(--zylem-radius-window);\\n border: 1px solid rgba(146, 205, 255, 0.54);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: var(--zylem-effect-shadow-panel);\\n backdrop-filter: blur(var(--zylem-effect-blur-md)) saturate(1.22);\\n overflow: hidden;\\n animation: Dialog_contentEnter__7rjyk1 0.16s var(--zylem-motion-ease-out);\\n}\\n.zylem-dialog-header {\\n min-height: 40px;\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--zylem-spacing-sm);\\n padding: 0 var(--zylem-spacing-md);\\n background: var(--zylem-material-glossy-bar);\\n border-bottom: 1px solid rgba(5, 18, 32, 0.85);\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.62), inset 0 -1px 0 rgba(255, 255, 255, 0.08);\\n}\\n.zylem-dialog-title {\\n margin: 0;\\n font-size: 13px;\\n font-weight: 700;\\n letter-spacing: 0.02em;\\n color: #F4FAFF;\\n font-family: var(--zylem-font-family);\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.65);\\n}\\n.zylem-dialog-body {\\n padding: var(--zylem-spacing-lg);\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n font-size: var(--zylem-font-size);\\n line-height: 1.45;\\n}\\n.zylem-dialog-footer {\\n display: flex;\\n justify-content: flex-end;\\n gap: var(--zylem-spacing-sm);\\n padding: 0 var(--zylem-spacing-lg) var(--zylem-spacing-lg);\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .zylem-dialog-content {\\n background: var(--zylem-color-surface);\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Progress/Progress.css.ts.vanilla.css?source=#H4sIAAAAAAAAE5VU0Y6jMAx871f45aQikQrY67Zlv8YkhuYaEuSElu7p_v2U0NWVXe6ke0BIHtszYxt273dDvRjYdUzeC3YuwM8NgNJ-MHivoTU0vW0gvYXSTDJoZ2uQzoy9jUiHQw1X5K0Qczc_oNS2E9Pks5hw0yqcayiL4tvb5tdm94nzTKiI11nR6M4KHaj3NUiygTiGf4w-6PYupLOBbKghUpJoKNyI7BqJwYZM4midDcLrd6qhLIfEYigE4g_dNRS74kh9RAJNQQRG61vHfQ3jMBBL9BRB6YzjpfUUEqnKk3RWId_TDBJri70292XFE5CtCb-iGemzcIlGbr90iVgGAqphyv6pb2Dd_6ewR-IVWaMNwo49sZY1BGxGgxwDfk1-YJSXJH9wXs-nw2Qw6Gua4Zl0dw7xOOZVLG4FwF2JW-NuNZy1UpTurXGsiAWj0qOv4XQ6zaVzvIZymMA7oxVw1-D2dMihfH3NoXqpcih21THZaVBeOnajVUvbPQZijUa0mowSnUE_X3HjJuHPqKKY5wJqW5LhAQltPYXVRbbazAf4x_Ls8a9-nhQabQlZdDGJbNiWx0JRl88Oy8Mxh6o85VDt99HiIXsg3485lC-HHKqqiMCpyr54SYqhSGMr5rLY5uMpdvssXzPcGXdbXFL6TB4rTmtcztVFRFjHPZpsDSL0JNwYnv8Zc9qlWY5RJDRO-TemIun7wAQAAA */\\n.zylem-progress-root {\\n display: flex;\\n flex-direction: column;\\n gap: var(--zylem-spacing-xxs);\\n width: 100%;\\n}\\n.zylem-progress-header {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n}\\n.zylem-progress-label {\\n font-size: 11px;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n color: var(--zylem-color-text-secondary);\\n font-family: var(--zylem-font-family);\\n}\\n.zylem-progress-value {\\n font-size: calc(var(--zylem-font-size) - 2px);\\n color: var(--zylem-color-primary);\\n font-family: var(--zylem-font-family);\\n font-variant-numeric: tabular-nums;\\n}\\n.zylem-progress-track {\\n position: relative;\\n height: 10px;\\n width: 100%;\\n overflow: hidden;\\n border-radius: 999px;\\n border: 1px solid rgba(97, 166, 232, 0.28);\\n background: var(--zylem-material-field-glass);\\n box-shadow: var(--zylem-effect-shadow-inset);\\n}\\n.zylem-progress-fill {\\n height: 100%;\\n border-radius: 999px;\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(178, 219, 255, 0.7),\\n rgba(48, 137, 220, 0.92));\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.5), var(--zylem-effect-glow-primary);\\n transition: width var(--zylem-motion-normal) var(--zylem-motion-ease-out);\\n width: var(--kb-progress-fill-width);\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Badge/Badge.css.ts.vanilla.css?source=#H4sIAAAAAAAAE5WUzW7bMAzH73kKorvEgGTIH3JsFTvskpcYelBtxhXqSIakLG6HvfsgOU4yrAgSGPKBpMgf_ySUfn4MuKevsusRfq8AOuXGQX4IUHpQGuluwOl5BSAH1WuqPO6dgBa1RxvMvRwF_JJ2TemcyY2yVbqn0-SSEDDKrlO6F5CN05eBbh_jXo3t0FIrO3VwAvgYq-6M9nQn92r4-LfMlSM5Bzr1iQJaObTr_2KDLwEKxThdLhxR9W9ewIaxYBvQe7QLmQCWMo774PE4eeqt1G5n7F7AYRzRttLh2eneZGeOAlhsNBzbv8o1I_FLq1i0NYOxAr5ty-2P7XZuezpfVdqhPyVg8_Wcc7IclhZ5Qs5R9CpsqVLGKsc35TF2gQK0OVo5BvPBhd5wwNYHs8bn1Z9VejX_n530knqj8fuT0jvz9ELg2i-08etL0EsSF2Ye3DxfZwbVzUgZZwTyLPw4J8BSzuc5y_a9t-agOwFhwaSlfRg6ar_OatZhT04JNnVI0JwTlMnJUzACTUkgK-tgr3mS3GrlKK1Wun96uYUba-R5RSCCLwO7m3a-XzICWRWpSr7gZnWw5qEbdg8vWmvsHbRZkRPIsjLSPijunGDTfIXbMAI8J1DM6ta3ad2hbdG527xZvuzBSd2Hl6HOlwTNvAz5Rd4gBSNQVpG3us2r8eCtHG7zNpsgTEUgDxqztHgQt2IE4tQZn3dpkb0iUGQEiuayCOdX4frJiiYaHpbQzF9MHVLhpQUAAA */\\n.zylem-badge {\\n display: inline-flex;\\n align-items: center;\\n gap: var(--zylem-spacing-xxs);\\n padding: 1px var(--zylem-spacing-sm);\\n border-radius: 5px;\\n font-family: var(--zylem-font-family);\\n font-size: calc(var(--zylem-font-size) - 3px);\\n font-weight: 700;\\n letter-spacing: 0.05em;\\n text-transform: uppercase;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.6);\\n color: #F4FAFF;\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.32), inset 0 -1px 0 rgba(0, 0, 0, 0.4);\\n white-space: nowrap;\\n user-select: none;\\n}\\n.zylem-badge[data-tone=info],\\n.zylem-badge:not([data-tone]) {\\n border: 1px solid rgba(150, 210, 255, 0.55);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(178, 219, 255, 0.4),\\n rgba(30, 94, 148, 0.85));\\n}\\n.zylem-badge[data-tone=warning] {\\n border: 1px solid rgba(255, 226, 150, 0.6);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(255, 240, 168, 0.45),\\n rgba(180, 128, 20, 0.85));\\n}\\n.zylem-badge[data-tone=error] {\\n border: 1px solid rgba(255, 132, 114, 0.65);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(255, 179, 168, 0.45),\\n rgba(190, 52, 38, 0.88));\\n}\\n.zylem-badge[data-tone=success] {\\n border: 1px solid rgba(120, 255, 150, 0.55);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(182, 255, 195, 0.42),\\n rgba(18, 130, 46, 0.86));\\n}\\n.zylem-badge[data-tone=neutral] {\\n border: 1px solid rgba(97, 166, 232, 0.35);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(60, 80, 105, 0.6),\\n rgba(26, 31, 39, 0.85));\\n color: var(--zylem-color-text);\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Separator/Separator.css.ts.vanilla.css?source=Lnp5bGVtLXNlcGFyYXRvciB7CiAgYm9yZGVyOiBub25lOwp9Ci56eWxlbS1zZXBhcmF0b3JbZGF0YS1vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCJdIHsKICBoZWlnaHQ6IDFweDsKICB3aWR0aDogMTAwJTsKICBtYXJnaW46IHZhcigtLXp5bGVtLXNwYWNpbmctc20pIDA7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSg5NywgMTY2LCAyMzIsIDAuNCksIHRyYW5zcGFyZW50KTsKfQouenlsZW0tc2VwYXJhdG9yW2RhdGEtb3JpZW50YXRpb249InZlcnRpY2FsIl0gewogIHdpZHRoOiAxcHg7CiAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICBtYXJnaW46IDAgdmFyKC0tenlsZW0tc3BhY2luZy1zbSk7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgdHJhbnNwYXJlbnQsIHJnYmEoOTcsIDE2NiwgMjMyLCAwLjQpLCB0cmFuc3BhcmVudCk7Cn0 */\\n.zylem-separator {\\n border: none;\\n}\\n.zylem-separator[data-orientation=horizontal] {\\n height: 1px;\\n width: 100%;\\n margin: var(--zylem-spacing-sm) 0;\\n background:\\n linear-gradient(\\n 90deg,\\n transparent,\\n rgba(97, 166, 232, 0.4),\\n transparent);\\n}\\n.zylem-separator[data-orientation=vertical] {\\n width: 1px;\\n align-self: stretch;\\n margin: 0 var(--zylem-spacing-sm);\\n background:\\n linear-gradient(\\n 180deg,\\n transparent,\\n rgba(97, 166, 232, 0.4),\\n transparent);\\n}\\n\\n/* vanilla-extract-css-ns:src/components/WindowControls/WindowControls.css.ts.vanilla.css?source=#H4sIAAAAAAAAE7VUS2_bMAy-51cI2CUBTMNuk7ZTT7vkP-wo27TDTZEMic6jw_77ICkPZ6gzIMBgGLBJ4nuQovKPo8Yt7Mk0dg-1Neys9uLXTIiGfK_VUYpW4-F9JoTS1Bkgxq2XokbD6EK4U70Ur_3hffZ7ln8Gl4m81VYxmQ56ZVBDNTBbE1mU1lIMxiMHrMoewNMHmU6KyroGHVQ2kteD89ZJ0Vs6E2_JwJ4a3khRvvWxaoPUbfj636umiWCFWKbIxRUZTQbhH-Z-DJ6pPUYraHicaq3hIBalKIsEHhEvGqJsq4PqL-vl-tt6HSKMBwa_UY3dB1llf4iv6yo1L7L45C-L1IzYAKcaGrwUO-XmAKnBKXZu8KhaRjBvNTUJ8mm1ys5vkT-_pVpV_-ycHUxzC7tVjI7UeUDQaeX94jKYk2gK07oILz7jWS2yUxmEGhgVnj0uF9nJ_vPf9peRkp0ynpiskaIlzehutdqQglZ5XnyWQOUR7MCLLCG11m0fBbj262GENMt4HB7DmFwvubE7dFNLlrJx1VITpahcOKAGvZ-X-dO116FDMn1qxfh9HsZ2h1fVTDucJE7pKeYi_3qH-T5xa-vBw448VXqa_6Yqyvg_h3g8NGxbrBkStSPTTbsAqLX1OJrP1FbGQwOqDlfP-GI43S0X5aJ8KTJRropMFPnr6pG9XT5sudN2D40yHbrg-Q-fswJFWAYAAA */\\n.zylem-window-controls {\\n display: flex;\\n align-items: center;\\n gap: 7px;\\n}\\n.zylem-window-control,\\n.floating-panel-button {\\n all: unset;\\n box-sizing: border-box;\\n cursor: pointer;\\n min-width: 18px;\\n height: 18px;\\n padding: 0 4px;\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 10px;\\n line-height: 1;\\n color: #F4FAFF;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.6);\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(255, 255, 255, 0.38);\\n background: var(--zylem-material-button-glass);\\n box-shadow:\\n inset 1px 1px 0 rgba(255, 255, 255, 0.5),\\n inset -1px -1px 0 rgba(0, 0, 0, 0.4),\\n 0 1px 3px rgba(0, 0, 0, 0.4);\\n transition:\\n filter var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n transform var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n background var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n border-color var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-window-control:hover,\\n.floating-panel-button:hover {\\n filter: brightness(1.2);\\n transform: translateY(-1px);\\n}\\n.zylem-window-control:active,\\n.floating-panel-button:active {\\n filter: brightness(0.9);\\n transform: translateY(1px);\\n}\\n.zylem-window-control:focus-visible,\\n.floating-panel-button:focus-visible {\\n box-shadow:\\n inset 1px 1px 0 rgba(255, 255, 255, 0.5),\\n inset -1px -1px 0 rgba(0, 0, 0, 0.4),\\n var(--zylem-effect-focus-ring);\\n}\\n.zylem-window-control--close:hover {\\n background: var(--zylem-color-accent);\\n border-color: rgba(255, 160, 150, 0.75);\\n box-shadow:\\n inset 1px 1px 0 rgba(255, 255, 255, 0.4),\\n inset -1px -1px 0 rgba(0, 0, 0, 0.4),\\n var(--zylem-effect-glow-danger);\\n}\\n\\n/* vanilla-extract-css-ns:src/components/TitleBar/TitleBar.css.ts.vanilla.css?source=Lnp5bGVtLXRpdGxlYmFyIHsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIG1pbi1oZWlnaHQ6IDQycHg7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogdmFyKC0tenlsZW0tc3BhY2luZy1zbSk7CiAgcGFkZGluZzogMCB2YXIoLS16eWxlbS1zcGFjaW5nLW1kKTsKICBiYWNrZ3JvdW5kOiB2YXIoLS16eWxlbS1tYXRlcmlhbC1nbG9zc3ktYmFyKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg1LCAxOCwgMzIsIDAuODUpOwogIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjYyKSwgaW5zZXQgMCAtMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjA4KTsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQouenlsZW0tdGl0bGViYXItLWNvbXBhY3QgewogIG1pbi1oZWlnaHQ6IDMycHg7CiAgcGFkZGluZzogMCB2YXIoLS16eWxlbS1zcGFjaW5nLXNtKTsKfQouenlsZW0tdGl0bGViYXItdGl0bGUgewogIGZsZXg6IDE7CiAgZm9udC1zaXplOiAxM3B4OwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICBjb2xvcjogI0Y0RkFGRjsKICBmb250LWZhbWlseTogdmFyKC0tenlsZW0tZm9udC1mYW1pbHkpOwogIHRleHQtc2hhZG93OiAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjY1KTsKICBvdmVyZmxvdzogaGlkZGVuOwogIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLnp5bGVtLXRpdGxlYmFyLS1kcmFnZ2FibGUgewogIGN1cnNvcjogZ3JhYjsKfQouenlsZW0tdGl0bGViYXItLWRyYWdnYWJsZTphY3RpdmUgewogIGN1cnNvcjogZ3JhYmJpbmc7Cn0 */\\n.zylem-titlebar {\\n box-sizing: border-box;\\n min-height: 42px;\\n display: flex;\\n align-items: center;\\n gap: var(--zylem-spacing-sm);\\n padding: 0 var(--zylem-spacing-md);\\n background: var(--zylem-material-glossy-bar);\\n border-bottom: 1px solid rgba(5, 18, 32, 0.85);\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.62), inset 0 -1px 0 rgba(255, 255, 255, 0.08);\\n user-select: none;\\n}\\n.zylem-titlebar--compact {\\n min-height: 32px;\\n padding: 0 var(--zylem-spacing-sm);\\n}\\n.zylem-titlebar-title {\\n flex: 1;\\n font-size: 13px;\\n font-weight: 700;\\n letter-spacing: 0.02em;\\n color: #F4FAFF;\\n font-family: var(--zylem-font-family);\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.65);\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.zylem-titlebar--draggable {\\n cursor: grab;\\n}\\n.zylem-titlebar--draggable:active {\\n cursor: grabbing;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Panel/Panel.css.ts.vanilla.css?source=#H4sIAAAAAAAAE5VVUW-jMAx-76_wY5EIgnbtbuzl_koghuYWkigxg-7U_35K6HW0pdudEFSyHdv5Pn9u9nFU2DHLNSr4vQKozMi8_JC6LaEyTqBjlRlfVwBCeqv4sYRGYTSEXyakw5qk0SXURvWdDp5OanZA2R6ohPw1Zo2ZHBey9yW8c7dmbCo92aYOks_YEgo7gjdKCnBtxdcvzykU-30Km-0mhTzb_piief3WOtNrcZ2244ROcsVaxf05PRPcvZ1rjMwfuDBDCTkUezvCNnxipTyNT7bdJylI7ZFCjB0hn_yb3S79--ZZ_nLpQzhjWSMVhfYr1bv1vCNsGqyJBTvzXZKA59Q7TrgusuIpJjHv6BoVmjpIIVC_rk6rbMYQYxM4Cr0_szVhpY3GBZzzW4TIce0td6jpFoZLituLTI7bRgaphRlmTXxF7hT8FbvFU2A236UQUIU82z3dEbUA5uSaD89_0dCJaxo2m-TupgfkAt032pgP_HZjl_XClWw1k4SdL6FGTeiC-VfvSTZHVhtNqKkEb3mNrEIaEKOcWm6vbx8ipG7DGAW_5ULEpvLFqE7MkGeVITLdt_KKUPyDvOYgsVYZ7-94-1ZCxS6e6T065lFhTQ-m7lyGJCmMjDRGU6AESyiKCfZoGs5cPOdRAgqJQu4JkBKCarELHsKRWFRFY1xXQm8tupr7KIXaKOOu7x1NLJxKLsUa3kl1vI6bOZJLndnGsWN8r_bNbvdgCZyPfzpQKWm99ME1HCRhvBoG1AbH7R1ulRHHCS-FYwnF4o6-TNHDGVrIylijen-IyT_HMIT-9L21xpEHbQjWy8Is7Jgk8XB2-0f0ePYmDnzvGl5jhOx0k-BuT365BU-r0x8_WRX9BwcAAA */\\n.zylem-panel {\\n box-sizing: border-box;\\n display: flex;\\n flex-direction: column;\\n min-height: 0;\\n border-radius: var(--zylem-radius-panel);\\n border: 1px solid rgba(97, 166, 232, 0.38);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: 0 16px 36px rgba(0, 0, 0, 0.36), inset 0 1px 0 rgba(255, 255, 255, 0.09);\\n backdrop-filter: blur(var(--zylem-effect-blur-sm)) saturate(1.14);\\n overflow: hidden;\\n}\\n.zylem-panel--borderless {\\n border: none;\\n border-radius: 0;\\n background: transparent;\\n box-shadow: none;\\n backdrop-filter: none;\\n}\\n.zylem-panel--window {\\n border-radius: var(--zylem-radius-window);\\n border: 1px solid rgba(146, 205, 255, 0.54);\\n box-shadow: var(--zylem-effect-shadow-panel);\\n backdrop-filter: blur(var(--zylem-effect-blur-md)) saturate(1.22);\\n}\\n.zylem-panel-header {\\n box-sizing: border-box;\\n min-height: 32px;\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: var(--zylem-spacing-sm);\\n padding: 0 var(--zylem-spacing-md);\\n border-bottom: 1px solid rgba(97, 166, 232, 0.22);\\n background: var(--zylem-material-panel-header-gloss);\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15);\\n user-select: none;\\n}\\n.zylem-panel-header-title {\\n font-size: 11px;\\n font-weight: 700;\\n letter-spacing: 0.09em;\\n text-transform: uppercase;\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.55);\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.zylem-panel-body {\\n flex: 1;\\n min-height: 0;\\n padding: var(--zylem-spacing-md);\\n}\\n.zylem-panel-body--flush {\\n padding: 0;\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .zylem-panel {\\n background: var(--zylem-color-surface);\\n }\\n .zylem-panel--borderless {\\n background: transparent;\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Toolbar/Toolbar.css.ts.vanilla.css?source=Lnp5bGVtLXRvb2xiYXIgewogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogdmFyKC0tenlsZW0tc3BhY2luZy1zbSk7CiAgcGFkZGluZzogdmFyKC0tenlsZW0tc3BhY2luZy1zbSk7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tenlsZW0tcmFkaXVzLWNvbnRyb2wpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoOTcsIDE2NiwgMjMyLCAwLjMpOwogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTMwLCAxODAsIDIzMCwgMC4yKSwgcmdiYSgzMCwgNjAsIDk1LCAwLjI4KSA1MCUsIHJnYmEoOCwgMjIsIDM4LCAwLjQpKTsKICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4yMiksIGluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsMC4zNSk7Cn0KLnp5bGVtLXRvb2xiYXItLXZlcnRpY2FsIHsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9Ci56eWxlbS10b29sYmFyLnNlcGFyYXRvciB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoOTcsIDE2NiwgMjMyLCAwLjQpOwp9 */\\n.zylem-toolbar {\\n box-sizing: border-box;\\n display: flex;\\n align-items: center;\\n gap: var(--zylem-spacing-sm);\\n padding: var(--zylem-spacing-sm);\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(97, 166, 232, 0.3);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(130, 180, 230, 0.2),\\n rgba(30, 60, 95, 0.28) 50%,\\n rgba(8, 22, 38, 0.4));\\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.22), inset 0 -1px 0 rgba(0, 0, 0, 0.35);\\n}\\n.zylem-toolbar--vertical {\\n flex-direction: column;\\n}\\n.zylem-toolbar.separator {\\n border-bottom: 1px solid rgba(97, 166, 232, 0.4);\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Property/Property.css.ts.vanilla.css?source=#H4sIAAAAAAAAE61U227bMAx9z1fwZUADWIGdNF2rfo0i0bZQWRIoOpcO_fdBcnpJG3fYsCfB5KF5ziGl1fPJ4SAihYjEJ-FsYvi1ADA2RadOElqHx8cFlFMYS6jZBi9BBzcOPmd2gQySIGXsmCTsFd0IMf13igkdPFNwy3e0hCYeIQVnDVC3UzcPPyto7u4qWG_WFdSr5n5CK_3UURi9kRPuvoLmoYJNk0GbbQGFPVLrwkFCb41B_7h4Waw-CaNwKLoG60WPtutZwqaORdqb1o6syYF8CsYhOsUoJqVJQtOs4xGaljJGOdt5YRmHJEGjZyzhTsVLC1JU2vpOpKFwjcoY67vrmGNafld7NnoXmMNwzcFsYPavXjXrL_Y561GR6PJM0PPNQ22wq67U1rfbZQVMyqeoCD3D7fbHcsZU6VRioXvrTPH3E0cfPM5V9nluU9G_0Gw2y6vs19sl3M0QdmqHrrRsg2eR7DPmsU5r4JAZ6dV0CfWqvschZxiPLIohbaBBwhgjklYJc1IHF-hyniUkSlVCHbxRdCrzKF1bNVh3uqz4kJhZ6TOL9wQ6Z2OyKacOvWUszDF7fiAVc3hMWQ861Dw_ir1yIxZPZpVEssOFhMm4LwJy-O90lu_D-T5u6_rxfEUP1nAvof5fXszIFkI7q5_Uzp0dGCllC2Kwrxe6dDKoA6np4Ru9QcpbeiUrEp8cSjCBGc0b4K1EhLZNyBLWeeX-TOrDHZnpVB6Ab9dQabb7PJaX3xQhzG_tBQAA */\\n.zylem-property-list {\\n display: flex;\\n flex-direction: column;\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(97, 166, 232, 0.18);\\n background: rgba(8, 19, 31, 0.35);\\n overflow: hidden;\\n}\\n.zylem-property-row {\\n min-height: 30px;\\n display: grid;\\n grid-template-columns: 112px 1fr;\\n align-items: center;\\n gap: var(--zylem-spacing-sm);\\n padding: var(--zylem-spacing-xs) var(--zylem-spacing-sm);\\n border-bottom: 1px solid rgba(97, 166, 232, 0.12);\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(97, 166, 232, 0.045),\\n transparent 45%);\\n}\\n.zylem-property-row:last-child {\\n border-bottom: none;\\n}\\n.zylem-property-row:hover {\\n background:\\n linear-gradient(\\n 90deg,\\n rgba(97, 166, 232, 0.13),\\n rgba(97, 166, 232, 0.025) 65%);\\n}\\n.zylem-property-label {\\n font-size: 11px;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n color: var(--zylem-color-text-secondary);\\n font-family: var(--zylem-font-family);\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n user-select: none;\\n}\\n.zylem-property-value {\\n color: var(--zylem-color-primary);\\n font-size: var(--zylem-font-size);\\n font-family: var(--zylem-font-family);\\n font-weight: 500;\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.zylem-property-value--clickable {\\n cursor: pointer;\\n text-decoration: underline;\\n text-decoration-style: dotted;\\n text-underline-offset: 2px;\\n}\\n.zylem-property-value--clickable:hover {\\n text-decoration-style: solid;\\n color: var(--zylem-color-active);\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Console/Console.css.ts.vanilla.css?source=#H4sIAAAAAAAAE51Ty27bMBC8-yv2UsQGRMNS06Rhjr33HyhxJS9CcQWSsmQX_fdCpGPXtpIgORGcHczu7GN92BtsRcXWs8HpDYosOvizAOjYUyC2EhwaFWiHzwsATb4zai-hNjhOwPQKTQ6rRK7Y9K2dIi1ZsUVqtkHCZgJeP_lm8236D6TD9vwteRSeDmQbCSU7jU6UHHN0SusI75RbCpGq9p2qyDbCt6vnxd_F-tLL4FTXfd6JhHym9Gv1qPoG_emhG2fMXXt_22yrXEP22LKPnQM49HRACZZtNMY7dLXhQewlqD5wShdTOKWp95dqCYvDd2xWZ7aEvBvBsyENrinV8ukxg_zhIYPie5HBZl38TGxVvTSOe6tl4t1nkBcZFJuJ9FisTn63SvNwmR3rGqtwDAmyHkPkV2zYXVIjdBpwwDExa7ZB1Kols5dw94t7R-jgNw53GbRseeoWnoipVZUy1fJ_7VNsBWKyHZUNWTzNNV_f_4jd7cOEn9s9bClgnAlK6FxavRhgp0XpUL1IiI-YkNttkjVXvRc78lQed-sz3crmGEnSkW3mjkPFW_VXx6FKz6YP0VTgbn7nRp92LjXlna28Oa9GvS95EGT18aRuKq4MKnfEyj4EthnMUb5i6fWMPrR0UeE_a-L9RjwFAAA */\\n.zylem-console-container {\\n position: relative;\\n display: flex;\\n flex-direction: column;\\n min-height: 0;\\n height: 100%;\\n width: 100%;\\n box-sizing: border-box;\\n padding: var(--zylem-spacing-sm);\\n}\\n.zylem-console-wrapper {\\n position: relative;\\n display: flex;\\n flex: 1;\\n min-height: 0;\\n}\\n.zylem-console {\\n flex: 1;\\n min-height: 96px;\\n width: 100%;\\n height: 100%;\\n box-sizing: border-box;\\n margin: 0;\\n padding: var(--zylem-spacing-sm);\\n resize: none;\\n overflow-y: auto;\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid rgba(97, 166, 232, 0.28);\\n background: rgba(4, 12, 20, 0.72);\\n box-shadow: var(--zylem-effect-shadow-inset);\\n color: var(--zylem-color-console-text);\\n font-family: \\\"Courier New\\\", monospace;\\n font-size: calc(var(--zylem-font-size) - 1px);\\n line-height: 1.45;\\n outline: none;\\n white-space: pre-wrap;\\n word-break: break-word;\\n}\\n.zylem-console:focus-visible {\\n box-shadow: var(--zylem-effect-shadow-inset), var(--zylem-effect-focus-ring);\\n}\\n.zylem-console-actions {\\n position: absolute;\\n top: var(--zylem-spacing-xs);\\n right: var(--zylem-spacing-sm);\\n display: flex;\\n gap: var(--zylem-spacing-xs);\\n z-index: 1;\\n}\\n.zylem-console-clear.zylem-button,\\n.zylem-console-clear {\\n position: absolute;\\n top: var(--zylem-spacing-sm);\\n right: var(--zylem-spacing-sm);\\n z-index: 1;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Sidebar/Sidebar.css.ts.vanilla.css?source=#H4sIAAAAAAAAE51V227bMAx9z1cIGAbEQGTYWZNu7sv2kp8Y9kBLtCtUlgyJTpwO_fdBstPZi9OiQ5AE5hEvOiSPU68kluDY7xVjpe25V8_K1AUrrZPoeGn7hxVjUvlWw7lglcZoCP9cKoeClDUFE1Z3jQlIowx_RFU_UsGyYLg85Fn2OTzbI7pK2xM_Fww6ssFWgniqne2MLNgR3Jrz57PGhjdA6BRoXmvwnrdgUHMJ7imJXkONbozf9sxbrSRzdQnrb_cblu_3G7b9st2wLN1-TS6ZpLMtr5QmdAUrdefW05xYVSiIBzv3TZIwD9Q5IFznaZ48rF5W6Uga98P1I3kfoKgFKZWpeWmJbDO_sW9BBMw3i6k4KdIYE45Rbrov2hu5bO99ZKeyhsIIYGhX27-aTmMP77PYUo1E6C7OBcvSfItNQAh74uTA-Mq6pmBd26IT4DGAwmrr5vVGE49eHoU1Etz5byUVNEqf5x4TIB7sfKgENQoqmLEGZ7Qpwma5PaBVbSLuCybQELpgrqF9oyHvsN77m6zH1QBXK1Ow7K0WXIYapOr8PM1g48IaclZPTk-HP5LfgkND73L-MaYnw3F1LJjjIdE5HxK2Vl0oXejQOCgShXUwrMcFmErB7HBsWME0VvFi8Z5q8P3rM1cPG1emAk_JEoDgkduOks2F9UjN_8W4GrviMSjdIKyTOy2KU7699v8pgYCDIHXEXxs2w1LlR-Qq_qJ8lh2RNYOK3pibWFe-yzZsm4ef3S4UthtP99w_grSnefxRKgdoTJJMpu7T4e7w43C4kpH9ICPD2o9xs1hL-MZKsk38pPsFYisrOs-Pyqty1ELbkVYGJ1P0dsVDBKdMvcS78lBqlP-SPjTkFR0Sh-Wlc5DAu910_o0NE6vtCWXI8N13bWsd-QCw9fJbKG_7JIlh0-lr-XZ_h032natADOv3snr5A60MnTHTBwAA */\\n.sidebar {\\n box-sizing: border-box;\\n display: flex;\\n flex-direction: column;\\n min-height: 0;\\n height: 100%;\\n overflow-y: auto;\\n background: var(--zylem-material-glass-panel-dark);\\n border-right: 1px solid rgba(97, 166, 232, 0.28);\\n backdrop-filter: blur(var(--zylem-effect-blur-sm)) saturate(1.1);\\n}\\n.sidebar-section {\\n display: flex;\\n flex-direction: column;\\n padding-bottom: var(--zylem-spacing-sm);\\n}\\n.sidebar-section-title {\\n padding: var(--zylem-spacing-sm) var(--zylem-spacing-md) var(--zylem-spacing-xs);\\n font-size: 10px;\\n font-weight: 700;\\n letter-spacing: 0.12em;\\n text-transform: uppercase;\\n color: var(--zylem-color-text-secondary);\\n font-family: var(--zylem-font-family);\\n user-select: none;\\n}\\n.sidebar-item {\\n display: flex;\\n align-items: center;\\n gap: var(--zylem-spacing-sm);\\n padding: var(--zylem-spacing-xs) var(--zylem-spacing-md);\\n margin: 0 var(--zylem-spacing-xs);\\n border-radius: var(--zylem-radius-control);\\n border: 1px solid transparent;\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n font-size: var(--zylem-font-size);\\n cursor: pointer;\\n user-select: none;\\n text-decoration: none;\\n background: none;\\n text-align: left;\\n transition: background var(--zylem-motion-fast) var(--zylem-motion-ease-out), border-color var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.sidebar-item:hover {\\n background: rgba(97, 166, 232, 0.12);\\n}\\n.sidebar-item[data-active],\\n.sidebar-item.is-active {\\n background: var(--zylem-material-button-glass);\\n border: 1px solid rgba(150, 210, 255, 0.5);\\n box-shadow: var(--zylem-effect-shadow-button);\\n color: #F4FAFF;\\n font-weight: 600;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.6);\\n}\\n.sidebar-item:focus-visible {\\n outline: none;\\n box-shadow: var(--zylem-effect-focus-ring);\\n}\\n.sidebar-item[disabled],\\n.sidebar-item[data-disabled] {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .sidebar {\\n background: var(--zylem-color-surface);\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Card/Card.css.ts.vanilla.css?source=#H4sIAAAAAAAAE71UwW7iMBC98xUj7QWkGCWhod1w2gv_sEdjT8Kojm3ZDgRW_feVHSjQsq22Wq1QIPI8nufNe_b8eFDYMcGdhF8TgI0ZmKcj6baGjXESHduYYTUBkOSt4ocaGoVpIf4ySQ5FIKNrEEb1nY6VltsadtxNGRvpveWCdMsGP4t1y6VMO9zDdDJhTps7Lqn3t8hxLfV8Ba2hsAN4o0iCazd8-v0xg2K5zKBclBnk80U5orl4bp3ptbxl7XhAR1yxVnHvmeUaFZPcPZ_2GJjfcmn2NeTwZAcoczuMG-VZ-swXswxIewyQp17ysVxWVXZ-8nn-lPiEUcbdNpCWWMAhJERjdGAN70gdbnFXhQQMjmtPowfpvTGuu5VmYpU13IfZvQJyj8z0YZZd6fw6QzIuqfkax2ryMplfcskY6YCOi0A7TCEVvfNxetakShoCDoFxRa2uQWETPuKot2aH7hT3S7P1aFdR5RmURfyqqpib5T8PQHYjH5sGRWCtMntmHXXcXfkavTzZqnjAn1NW2OHDCdVXg7pP8SlDY0Tv2Y48bdRIZPqgSGMN2mj8m3HcETqyO9Lt-y48KhQB5Z_MKc-2LPP_bc04m3ctBwqnGaVz6emId45rXL6c6j1Suw01POb51V3wbf2w_rFev6b5Iik2XLxVVFWJMEa5URG3JSlRv_79UkClyHrysbTfUsB01yYz947bt4okeuHIxjP5VpfgSkzviwMGZcrVJ3cb8yiMlueQx1Sx7WkexfxhNXn5DZ6U5-KTBgAA */\\n.zylem-card {\\n box-sizing: border-box;\\n display: flex;\\n flex-direction: column;\\n gap: var(--zylem-spacing-xs);\\n padding: var(--zylem-spacing-md);\\n border-radius: var(--zylem-radius-card);\\n border: 1px solid rgba(97, 166, 232, 0.32);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.08);\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n transition:\\n transform var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n box-shadow var(--zylem-motion-fast) var(--zylem-motion-ease-out),\\n border-color var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-card--interactive {\\n cursor: pointer;\\n text-align: left;\\n}\\n.zylem-card--interactive:hover {\\n border-color: rgba(150, 210, 255, 0.6);\\n box-shadow:\\n 0 8px 20px rgba(0, 0, 0, 0.3),\\n inset 0 1px 0 rgba(255, 255, 255, 0.08),\\n var(--zylem-effect-glow-primary);\\n transform: translateY(-1px);\\n}\\n.zylem-card--interactive:active {\\n transform: translateY(1px);\\n}\\n.zylem-card--interactive:focus-visible {\\n outline: none;\\n box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3), var(--zylem-effect-focus-ring);\\n}\\n.zylem-card--selected {\\n border-color: rgba(20, 255, 60, 0.6);\\n box-shadow:\\n 0 8px 20px rgba(0, 0, 0, 0.3),\\n inset 0 1px 0 rgba(255, 255, 255, 0.08),\\n var(--zylem-effect-glow-active);\\n}\\n.zylem-card-title {\\n font-size: var(--zylem-font-size);\\n font-weight: 700;\\n color: #F4FAFF;\\n text-shadow: 0 1px 1px rgba(0, 0, 0, 0.55);\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.zylem-card-description {\\n font-size: calc(var(--zylem-font-size) - 2px);\\n color: var(--zylem-color-text-secondary);\\n line-height: 1.4;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/SearchInput/SearchInput.css.ts.vanilla.css?source=Lnp5bGVtLXNlYXJjaCB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICB3aWR0aDogMTAwJTsKfQouenlsZW0tc2VhcmNoLWljb24gewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiB2YXIoLS16eWxlbS1zcGFjaW5nLXNtKTsKICB3aWR0aDogMTRweDsKICBoZWlnaHQ6IDE0cHg7CiAgY29sb3I6IHZhcigtLXp5bGVtLWNvbG9yLXRleHQtc2Vjb25kYXJ5KTsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQouenlsZW0tc2VhcmNoLWlucHV0IHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDI4cHg7CiAgcGFkZGluZy1sZWZ0OiAyOHB4Owp9 */\\n.zylem-search {\\n position: relative;\\n display: flex;\\n align-items: center;\\n width: 100%;\\n}\\n.zylem-search-icon {\\n position: absolute;\\n left: var(--zylem-spacing-sm);\\n width: 14px;\\n height: 14px;\\n color: var(--zylem-color-text-secondary);\\n pointer-events: none;\\n}\\n.zylem-search-input {\\n width: 100%;\\n height: 28px;\\n padding-left: 28px;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/MenuButton/MenuButton.css.ts.vanilla.css?source=#H4sIAAAAAAAAE6VUwW7bMAy95ysE7BIDUdB4Sbuql_3HMBS0RdtaZcmQKDfpkH8fJNVNsqZJsV0EiKQeH_lILV92Gnveowm8CkTWsN8zxgbrFSlrBHOogdSIDzPGpPKDhp1gymhlkDcat9EOWrWGK8LeC-bJIdXdw2w_W74Df3xsoMaU4lNgNRpCF82_gifV7HhtDaGhg-t8mrrD0b0rBipvdaBUjFNtR4LxckhpK0tk-8P9jd6_8mLsWUnqBFutM2KHOeN0H0BKZVrBbuKtsYa4Vy8o2H32p668PYqW2mrrBHNtBfNys1mww3GzvNsUqQ6on1png5FT4M2ClesF-1rGqPsyR1kn0Qm2GrbMW63kB6Cr26Nw7kCq4AUbwc05z13PtlS-szpF18H5yHOwamoFOTCTCKmKE4zeRg9vwFNxzoHgkdtAxWJi8h8YVyaGc09Aqn6dnFQBxxENecGMNXjlvejsiE4YS_MfUnmoNMqfRUJ7le9L0zRHTb0o6voaXdHYOng-Kq8qnRfLBoqjM7GNibbcdyDt86l02DRYE88ITpn2WrJDQTnRALWinYg8N8fCG0sctLbPKD9CHMCgTigvXBmJ21NqGnbo0oviaPCPI5KJE26peFufBnqld6dxR45PjnKidmlL7u8WbHV7u2Bl3qn1-807GUAgdAo0bzX4V3guwT0VnxAnu445Qf0knR14ozRFcpUObn7mZbTzXhYF80DBAeF8tSzz-v81Ihd-aj-2SaXpL_v211-W7vvZdx-GwTryUXs2P09yNWyLvAmXJ-LjVmbRfXCRW6pkP9v_AaitkMDDBgAA */\\n.zylem-menu-button {\\n position: relative;\\n display: inline-flex;\\n align-items: stretch;\\n}\\n.zylem-menu-button__face {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n}\\n.zylem-menu-button__chevron {\\n position: absolute;\\n right: -2px;\\n bottom: -2px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 14px;\\n height: 14px;\\n padding: 0;\\n font-size: 9px;\\n line-height: 1;\\n color: rgba(255, 255, 255, 0.75);\\n background: rgba(20, 24, 32, 0.92);\\n border: 1px solid rgba(255, 255, 255, 0.16);\\n border-radius: var(--zylem-radius-control);\\n cursor: pointer;\\n transition: color var(--zylem-motion-fast) var(--zylem-motion-ease-out), border-color var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-menu-button__chevron--static {\\n pointer-events: none;\\n}\\n.zylem-menu-button__chevron:hover:not([disabled]) {\\n color: #fff;\\n border-color: rgba(255, 255, 255, 0.4);\\n}\\n.zylem-menu-button__chevron:focus-visible {\\n outline: none;\\n box-shadow: var(--zylem-effect-focus-ring);\\n}\\n.zylem-menu-button__chevron[disabled] {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n.zylem-menu-button__panel {\\n z-index: var(--zylem-layer-menu);\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n border-radius: var(--zylem-radius-panel);\\n border: 1px solid rgba(97, 166, 232, 0.45);\\n background: var(--zylem-material-glass-panel-dark);\\n box-shadow: var(--zylem-effect-shadow-panel);\\n backdrop-filter: blur(var(--zylem-effect-blur-md)) saturate(1.22);\\n outline: none;\\n}\\n.zylem-menu-button__face svg {\\n width: 18px;\\n height: 18px;\\n}\\n@supports not (backdrop-filter: blur(1px)) {\\n .zylem-menu-button__panel {\\n background: var(--zylem-color-surface);\\n }\\n}\\n\\n/* vanilla-extract-css-ns:src/components/ItemPicker/ItemPicker.css.ts.vanilla.css?source=#H4sIAAAAAAAAE61VwW7bMAy95yt0GZAAVeGkTdGpx31GURSKRNtcZUmQ6CTu0H8fJDuLvTlpD7vECEk_ko-P9O17Z6DhHtUbBPZrwZjG6I3sBCsNHJ8WLD-5xgCK0FnBlDNtY5Onkl6wvQxLznuY6KVCW_HYrJL_gJpqwTYPhc9IjTzyGrCqSbC7-8HopdZoq6tAyhkXphHZxAmOlCNKZ4mXskHTTeNGjtXT4mNxO2749TWCDKrOjec-Yx3QvglWzMRWwbU-_jeSGp0rd3sIpXEH3gkmW3KXEnNCMpCzNzJUaAUrWDGLfIxnTiK-g2Dfe66z5TBM4KEoks0AEYTTu4IVt8UjNMmTyOUUpI2lC41grfcQlIyQy07x1KX47UzJSNDMM_WZaKTByvL0fhRMgSUIIy2ti-Lbp6o5xtWnvJy0graGgPQXX0oatfxHRsm3Ypxt_HEsyxFEpix3IJiBMtt2Ur2lCVotWGbTywC2d7mgIQi29kcWnUE9H8CD1NjGabO9jStnKTjT19OGmAryDk-0ZTzsNXkuZALUuOTmpYy0mnOAjMBdS3Prk8Yk6iRhYR0tnzVGuTOgX1Z5-OPWQ7WTy812e8POP0lrF2FLp9rI9xhxN-jetWTQgmDWWejpSRsrtTtMuYGyBEW8Rwhoq0tJnrUkySMYUAT6Zb7o9aa4YevH4k_R64fVaDiDCuZD77eXU5-46ns779P9djxM65KijDuAvoDEK9P5erptaBNTfHKeRrft4pr9bCNh2WVZgaWxa-hTtSGp80f6d72guK9yUcPqTjYS34Gjcva09afPwpWg-VRG7sD0DA6HVLAatQb7Zx_PDjAGfcSYD0qNBPk0ZEEdgvQzOaDx1E2P7lc-Wl88y9fPzN1wZkbSeHhafPwGyQb0VrMHAAA */\\n.zylem-picker {\\n display: flex;\\n flex-direction: column;\\n gap: var(--zylem-spacing-sm);\\n width: 260px;\\n max-height: 340px;\\n padding: var(--zylem-spacing-sm);\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n}\\n.zylem-picker__search {\\n flex-shrink: 0;\\n}\\n.zylem-picker__groups {\\n display: flex;\\n flex-direction: column;\\n gap: var(--zylem-spacing-md);\\n overflow-y: auto;\\n}\\n.zylem-picker__group-title {\\n margin: 0 0 var(--zylem-spacing-xs);\\n font-size: 9px;\\n font-weight: 600;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n opacity: 0.5;\\n}\\n.zylem-picker__item {\\n display: flex;\\n gap: var(--zylem-spacing-sm);\\n align-items: center;\\n width: 100%;\\n padding: var(--zylem-spacing-xs) var(--zylem-spacing-xs);\\n font-family: inherit;\\n font-size: calc(var(--zylem-font-size) - 2px);\\n color: inherit;\\n text-align: left;\\n background: transparent;\\n border: 1px solid transparent;\\n border-radius: var(--zylem-radius-control);\\n cursor: pointer;\\n transition: background var(--zylem-motion-fast) var(--zylem-motion-ease-out);\\n}\\n.zylem-picker__item:hover:not([disabled]) {\\n background: rgba(255, 255, 255, 0.08);\\n}\\n.zylem-picker__item:focus-visible {\\n outline: none;\\n box-shadow: var(--zylem-effect-focus-ring);\\n}\\n.zylem-picker__item[data-selected] {\\n background: rgba(120, 180, 255, 0.16);\\n border-color: rgba(120, 180, 255, 0.45);\\n}\\n.zylem-picker__item[disabled] {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n.zylem-picker__item-glyph {\\n display: inline-flex;\\n flex-shrink: 0;\\n align-items: center;\\n justify-content: center;\\n color: currentColor;\\n}\\n.zylem-picker__item-glyph svg {\\n width: var(--zylem-size-icon-sm);\\n height: var(--zylem-size-icon-sm);\\n}\\n.zylem-picker__item-label {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n.zylem-picker__empty {\\n margin: 0;\\n padding: var(--zylem-spacing-sm) var(--zylem-spacing-xs);\\n font-size: calc(var(--zylem-font-size) - 3px);\\n opacity: 0.6;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/EmptyState/EmptyState.css.ts.vanilla.css?source=Lnp5bGVtLWVtcHR5LXN0YXRlIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBnYXA6IHZhcigtLXp5bGVtLXNwYWNpbmctc20pOwogIHBhZGRpbmc6IHZhcigtLXp5bGVtLXNwYWNpbmcteGwpOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBib3JkZXItcmFkaXVzOiB2YXIoLS16eWxlbS1yYWRpdXMtY2FyZCk7CiAgYm9yZGVyOiAxcHggZGFzaGVkIHJnYmEoOTcsIDE2NiwgMjMyLCAwLjMpOwogIGJhY2tncm91bmQ6IHJnYmEoOCwgMTksIDMxLCAwLjMpOwogIGNvbG9yOiB2YXIoLS16eWxlbS1jb2xvci10ZXh0LXNlY29uZGFyeSk7CiAgZm9udC1mYW1pbHk6IHZhcigtLXp5bGVtLWZvbnQtZmFtaWx5KTsKfQouenlsZW0tZW1wdHktc3RhdGUtdGl0bGUgewogIGZvbnQtc2l6ZTogdmFyKC0tenlsZW0tZm9udC1zaXplKTsKICBmb250LXdlaWdodDogNjAwOwogIGNvbG9yOiB2YXIoLS16eWxlbS1jb2xvci10ZXh0KTsKfQouenlsZW0tZW1wdHktc3RhdGUtbWVzc2FnZSB7CiAgZm9udC1zaXplOiBjYWxjKHZhcigtLXp5bGVtLWZvbnQtc2l6ZSkgLSAxcHgpOwogIGxpbmUtaGVpZ2h0OiAxLjQ1OwogIG1heC13aWR0aDogMzYwcHg7Cn0 */\\n.zylem-empty-state {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n justify-content: center;\\n gap: var(--zylem-spacing-sm);\\n padding: var(--zylem-spacing-xl);\\n text-align: center;\\n border-radius: var(--zylem-radius-card);\\n border: 1px dashed rgba(97, 166, 232, 0.3);\\n background: rgba(8, 19, 31, 0.3);\\n color: var(--zylem-color-text-secondary);\\n font-family: var(--zylem-font-family);\\n}\\n.zylem-empty-state-title {\\n font-size: var(--zylem-font-size);\\n font-weight: 600;\\n color: var(--zylem-color-text);\\n}\\n.zylem-empty-state-message {\\n font-size: calc(var(--zylem-font-size) - 1px);\\n line-height: 1.45;\\n max-width: 360px;\\n}\\n\\n/* vanilla-extract-css-ns:src/components/Kbd/Kbd.css.ts.vanilla.css?source=Lnp5bGVtLWtiZCB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBtaW4td2lkdGg6IDE4cHg7CiAgcGFkZGluZzogMXB4IHZhcigtLXp5bGVtLXNwYWNpbmcteHMpOwogIGJvcmRlci1yYWRpdXM6IDRweDsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDk3LCAxNjYsIDIzMiwgMC40KTsKICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDYwLCA4NSwgMTE1LCAwLjcpLCByZ2JhKDIwLCAzMiwgNDgsIDAuODUpKTsKICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4yOCksIGluc2V0IDAgLTFweCAwIHJnYmEoMCwwLDAsMC40NSksIDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuNCk7CiAgY29sb3I6IHZhcigtLXp5bGVtLWNvbG9yLXRleHQpOwogIGZvbnQtZmFtaWx5OiB2YXIoLS16eWxlbS1mb250LWZhbWlseSk7CiAgZm9udC1zaXplOiAxMHB4OwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIHVzZXItc2VsZWN0OiBub25lOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0 */\\n.zylem-kbd {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n min-width: 18px;\\n padding: 1px var(--zylem-spacing-xs);\\n border-radius: 4px;\\n border: 1px solid rgba(97, 166, 232, 0.4);\\n background:\\n linear-gradient(\\n 180deg,\\n rgba(60, 85, 115, 0.7),\\n rgba(20, 32, 48, 0.85));\\n box-shadow:\\n inset 0 1px 0 rgba(255, 255, 255, 0.28),\\n inset 0 -1px 0 rgba(0, 0, 0, 0.45),\\n 0 1px 2px rgba(0, 0, 0, 0.4);\\n color: var(--zylem-color-text);\\n font-family: var(--zylem-font-family);\\n font-size: 10px;\\n font-weight: 700;\\n letter-spacing: 0.04em;\\n text-transform: uppercase;\\n user-select: none;\\n white-space: nowrap;\\n}\\n/*# sourceMappingURL=styles.css.map */\";","/**\n * Local styles for entity list thumbnails and AABB dimension rulers.\n * Injected alongside @zylem/ui styles in the editor web component.\n */\nexport const entityPreviewCSS = `\n.panel-content .zylem-section {\n\tpadding: 0 10px 10px;\n\tbox-sizing: border-box;\n}\n\n.panel-content .zylem-section-title {\n\tmargin: 8px 0 10px;\n}\n\n.entity-grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fill, minmax(96px, 1fr));\n\tgap: 16px;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.entity-grid-item {\n\tbox-sizing: border-box;\n\tmin-width: 0;\n\twidth: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: stretch;\n\tgap: 0;\n\tpadding: 6px;\n\tmargin: 0;\n\tborder: 1px solid color-mix(in srgb, var(--zylem-color-border, #444) 80%, transparent);\n\tborder-radius: 6px;\n\tbackground: color-mix(in srgb, var(--zylem-color-surface, #2a2a2a) 90%, transparent);\n\tcolor: inherit;\n\tcursor: pointer;\n\ttext-align: left;\n}\n\n.entity-grid-item:hover {\n\tborder-color: var(--zylem-color-accent, #6ea8fe);\n}\n\n.entity-grid-item:focus-visible {\n\toutline: 2px solid var(--zylem-color-accent, #6ea8fe);\n\toutline-offset: 1px;\n}\n\n.entity-thumbnail {\n\twidth: 100%;\n\tmin-width: 0;\n}\n\n.entity-thumbnail-frame {\n\tposition: relative;\n\twidth: 100%;\n\tmin-width: 0;\n\taspect-ratio: 1;\n\toverflow: hidden;\n\tborder-radius: 4px;\n\tbackground: #3a3a3a;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.entity-thumbnail-image {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: cover;\n\tdisplay: block;\n\tpointer-events: none;\n}\n\n.entity-thumbnail-frame .entity-icon {\n\twidth: 40%;\n\theight: 40%;\n\topacity: 0.75;\n}\n\n.entity-grid-name {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tz-index: 2;\n\tdisplay: block;\n\tpadding: 4px 6px;\n\tfont-size: 11px;\n\tline-height: 1.2;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\ttext-align: center;\n\tcolor: rgba(255, 255, 255, 0.95);\n\tbackground: rgba(0, 0, 0, 0.45);\n\tpointer-events: none;\n}\n\n.entity-ruler {\n\tposition: absolute;\n\tpointer-events: none;\n\tcolor: rgba(255, 255, 255, 0.9);\n\tfont-size: 9px;\n\tline-height: 1;\n\tfont-variant-numeric: tabular-nums;\n\topacity: 0;\n\ttransition: opacity 120ms ease;\n}\n\n.entity-ruler-depth {\n\tposition: absolute;\n\ttop: 2px;\n\tright: 3px;\n\tz-index: 1;\n\tfont-size: 9px;\n\tline-height: 1;\n\tpadding: 1px 3px;\n\tborder-radius: 2px;\n\tbackground: rgba(0, 0, 0, 0.45);\n\tcolor: rgba(255, 255, 255, 0.85);\n\tfont-variant-numeric: tabular-nums;\n\topacity: 0;\n\ttransition: opacity 120ms ease;\n}\n\n.entity-grid-item:hover .entity-ruler,\n.entity-grid-item:hover .entity-ruler-depth,\n.entity-grid-item:focus-within .entity-ruler,\n.entity-grid-item:focus-within .entity-ruler-depth {\n\topacity: 1;\n}\n\n.entity-ruler-bottom {\n\tleft: 10px;\n\tright: 4px;\n\t/* Sit above the name caption so both stay readable on hover */\n\tbottom: 22px;\n\theight: 12px;\n\tdisplay: flex;\n\talign-items: flex-end;\n\tjustify-content: center;\n}\n\n.entity-ruler-side {\n\ttop: 4px;\n\tbottom: 36px;\n\tleft: 1px;\n\twidth: 12px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.entity-ruler-ticks {\n\tposition: absolute;\n\tinset: 0;\n\tborder: 0 solid rgba(255, 255, 255, 0.55);\n\tpointer-events: none;\n}\n\n.entity-ruler-bottom .entity-ruler-ticks {\n\tborder-top-width: 1px;\n\tborder-left-width: 1px;\n\tborder-right-width: 1px;\n\theight: 4px;\n\tbottom: 0;\n\ttop: auto;\n\tbackground-image: repeating-linear-gradient(\n\t\tto right,\n\t\trgba(255, 255, 255, 0.55) 0,\n\t\trgba(255, 255, 255, 0.55) 1px,\n\t\ttransparent 1px,\n\t\ttransparent 6px\n\t);\n\tbackground-size: 6px 3px;\n\tbackground-repeat: repeat-x;\n\tbackground-position: top left;\n}\n\n.entity-ruler-side .entity-ruler-ticks {\n\tborder-right-width: 1px;\n\tborder-top-width: 1px;\n\tborder-bottom-width: 1px;\n\twidth: 4px;\n\tleft: 0;\n\tright: auto;\n\tbackground-image: repeating-linear-gradient(\n\t\tto bottom,\n\t\trgba(255, 255, 255, 0.55) 0,\n\t\trgba(255, 255, 255, 0.55) 1px,\n\t\ttransparent 1px,\n\t\ttransparent 6px\n\t);\n\tbackground-size: 3px 6px;\n\tbackground-repeat: repeat-y;\n\tbackground-position: top right;\n}\n\n.entity-ruler-label {\n\tposition: relative;\n\tz-index: 1;\n\tpadding: 0 2px;\n\tbackground: rgba(0, 0, 0, 0.45);\n\tborder-radius: 2px;\n}\n\n.entity-ruler-side .entity-ruler-label {\n\twriting-mode: vertical-rl;\n\ttransform: rotate(180deg);\n}\n`;\n","/**\n * Local styles for the Bridge debug panel.\n * Injected alongside @zylem/ui styles in the editor web component.\n */\nexport const bridgePanelCSS = `\n.bridge-row--hot .zylem-property-label,\n.bridge-row--hot .zylem-property-value {\n\tcolor: #ffb347;\n\tfont-weight: 600;\n}\n\n.bridge-log {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tmax-height: 220px;\n\tfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\tfont-size: 11px;\n\tline-height: 1.4;\n}\n\n.bridge-log-row {\n\tdisplay: grid;\n\tgrid-template-columns: 52px minmax(96px, auto) 60px 1fr;\n\tgap: 8px;\n\talign-items: baseline;\n\tpadding: 2px 0;\n\tborder-bottom: 1px solid rgba(255, 255, 255, 0.06);\n\twhite-space: nowrap;\n}\n\n.bridge-log-kind {\n\ttext-transform: uppercase;\n\tfont-size: 9px;\n\tletter-spacing: 0.04em;\n\topacity: 0.85;\n}\n\n.bridge-log-kind--send {\n\tcolor: #7ee787;\n}\n\n.bridge-log-kind--flush {\n\tcolor: #79c0ff;\n}\n\n.bridge-log-kind--queue {\n\tcolor: #d2a8ff;\n}\n\n.bridge-log-type {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.bridge-log-meta {\n\topacity: 0.6;\n\ttext-align: right;\n}\n\n.bridge-log-summary {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\topacity: 0.75;\n}\n`;\n","/**\n * Local styles for the toolbar and the transform inspector.\n * Injected alongside @zylem/ui styles in the editor web component.\n *\n * The Add tool's split button and palette are `MenuButton` and `ItemPicker` from\n * @zylem/ui now, so only the glyph sizing for game-supplied icons is left here.\n */\nexport const addPaletteCSS = `\n/*\n * The toolbar carries three tool groups now, which overflows a narrow docked\n * panel; wrapping keeps every button reachable instead of clipping the tail.\n */\n.zylem-toolbar {\n\tflex-wrap: wrap;\n}\n\n.zylem-toolbar-divider {\n\twidth: 1px;\n\talign-self: stretch;\n\tmargin: 0 2px;\n\tbackground: rgba(255, 255, 255, 0.18);\n}\n\n/* Keeps a group's buttons together when the toolbar wraps. */\n.zylem-toolbar-group {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: inherit;\n}\n\n/* Keeps the gizmo buttons together when the toolbar wraps. */\n.zylem-toolbar-transforms {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: inherit;\n}\n\n.zylem-add-tool {\n\tdisplay: inline-flex;\n\talign-items: stretch;\n}\n\n/* Sizes the inline SVG the game's catalog supplies for the armed type. */\n.zylem-add-tool__glyph {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tcolor: currentColor;\n}\n\n.zylem-add-tool__glyph svg {\n\twidth: 18px;\n\theight: 18px;\n}\n\n/* ── Transform inspector ─────────────────────────────────────────────────── */\n\n.zylem-transform-row {\n\tdisplay: grid;\n\tgrid-template-columns: 54px repeat(3, minmax(0, 1fr));\n\tgap: 5px;\n\talign-items: center;\n\tmargin-bottom: 5px;\n}\n\n.zylem-transform-row__label {\n\tfont-size: 10px;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n\topacity: 0.65;\n}\n\n.zylem-transform-row__field {\n\twidth: 100%;\n\tmin-width: 0;\n\tpadding: 3px 5px;\n\tfont-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n\tfont-size: 11px;\n\tcolor: #e6edf3;\n\tbackground: rgba(255, 255, 255, 0.06);\n\tborder: 1px solid rgba(255, 255, 255, 0.12);\n\tborder-radius: 4px;\n}\n\n.zylem-transform-row__field:focus {\n\toutline: none;\n\tborder-color: rgba(120, 180, 255, 0.55);\n}\n\n.zylem-transform-empty {\n\tmargin: 0;\n\tpadding: 6px 0;\n\tfont-size: 11px;\n\topacity: 0.6;\n}\n\n.zylem-transform-snap {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 10px;\n\talign-items: center;\n\tmargin-top: 8px;\n\tpadding-top: 8px;\n\tborder-top: 1px solid rgba(255, 255, 255, 0.08);\n\tfont-size: 11px;\n}\n\n.zylem-transform-snap label {\n\tdisplay: inline-flex;\n\tgap: 5px;\n\talign-items: center;\n\tcursor: pointer;\n}\n\n.zylem-transform-hint {\n\tmargin: 6px 0 0;\n\tfont-size: 10px;\n\tline-height: 1.4;\n\topacity: 0.5;\n}\n`;\n","/**\n * Undo/redo keyboard shortcuts.\n *\n * Listens on `window` rather than the editor's shadow root, because the pointer\n * is usually over the game canvas — which is outside the overlay — while\n * editing. game-lib's keyboard provider also listens on `window` but never calls\n * `preventDefault`, so gameplay bindings and these shortcuts coexist.\n */\n\nimport { redo, undo } from './history-store';\n\n/** Tags that own their own undo stack and must keep their keystrokes. */\nconst EDITABLE_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n\n/**\n * Whether an event targets something the user is typing into.\n *\n * Walks the composed path, so a field inside the editor's shadow root is\n * recognised — `event.target` alone is retargeted to the host element and every\n * input in the overlay would look like the canvas.\n */\nexport function isEditableTarget(event: Event): boolean {\n\tconst path = typeof event.composedPath === 'function' ? event.composedPath() : [];\n\tconst nodes = path.length ? path : [event.target];\n\n\tfor (const node of nodes) {\n\t\tif (!(node instanceof HTMLElement)) continue;\n\t\tif (EDITABLE_TAGS.has(node.tagName)) return true;\n\t\tif (node.isContentEditable) return true;\n\t}\n\treturn false;\n}\n\n/** Whether a keydown is the undo or redo chord, and which. */\nexport function classifyHistoryShortcut(\n\tevent: KeyboardEvent,\n): 'undo' | 'redo' | null {\n\t// `metaKey` on macOS, `ctrlKey` elsewhere. Accepting either means a user on\n\t// an external keyboard with the other convention still gets the shortcut.\n\tif (!event.metaKey && !event.ctrlKey) return null;\n\tif (event.altKey) return null;\n\tif (event.key.toLowerCase() !== 'z') return null;\n\treturn event.shiftKey ? 'redo' : 'undo';\n}\n\nexport interface HistoryShortcutOptions {\n\t/**\n\t * Whether the shortcut is installed at all. Hosts that embed the editor\n\t * inside their own app may want to route undo by focus instead, in which\n\t * case they disable this and call `undo()` / `redo()` themselves.\n\t * @default true\n\t */\n\tenabled?: boolean;\n\ttarget?: Window;\n}\n\n/**\n * Install the undo/redo shortcut.\n *\n * @returns An uninstall function.\n */\nexport function installHistoryShortcuts(\n\toptions: HistoryShortcutOptions = {},\n): () => void {\n\tif (options.enabled === false) return () => {};\n\n\tconst target = options.target\n\t\t?? (typeof window !== 'undefined' ? window : undefined);\n\tif (!target) return () => {};\n\n\tconst onKeyDown = (event: KeyboardEvent) => {\n\t\tconst action = classifyHistoryShortcut(event);\n\t\tif (!action) return;\n\t\tif (isEditableTarget(event)) return;\n\n\t\t// Claimed only once it is actually ours to handle, so the browser's own\n\t\t// undo still works in text fields.\n\t\tevent.preventDefault();\n\t\tif (action === 'undo') {\n\t\t\tundo();\n\t\t} else {\n\t\t\tredo();\n\t\t}\n\t};\n\n\ttarget.addEventListener('keydown', onKeyDown);\n\treturn () => target.removeEventListener('keydown', onKeyDown);\n}\n","/**\n * Escape-to-disarm for the editor tools.\n *\n * Placement and the gizmo modes are sticky by design — you place ten crates\n * without re-picking the crate — so there has to be a way out that is not\n * \"find the button you pressed and press it again\". Escape is that way out.\n */\n\nimport { getDebugTool, setDebugTool } from '../entities/entities-state';\nimport { sendAddType, sendTool } from '../../bridge/editor-bridge';\nimport { isEditableTarget } from '../history/history-shortcuts';\nimport { catalogState, setArmedType } from './catalog-state';\n\nexport interface ToolShortcutOptions {\n\t/** @default true */\n\tenabled?: boolean;\n\ttarget?: Window;\n}\n\n/** Drop the armed placement type and return to the neutral tool. */\nexport function disarmTools(): boolean {\n\tconst hadTool = getDebugTool() !== 'none';\n\tconst hadType = catalogState.armedTypeId !== null;\n\tif (!hadTool && !hadType) return false;\n\n\tif (hadType) {\n\t\tsetArmedType(null);\n\t\tsendAddType(null);\n\t}\n\tif (hadTool) {\n\t\tsetDebugTool('none');\n\t\tsendTool('none');\n\t}\n\treturn true;\n}\n\n/**\n * Install the Escape shortcut.\n *\n * @returns An uninstall function.\n */\nexport function installToolShortcuts(options: ToolShortcutOptions = {}): () => void {\n\tif (options.enabled === false) return () => {};\n\n\tconst target = options.target\n\t\t?? (typeof window !== 'undefined' ? window : undefined);\n\tif (!target) return () => {};\n\n\tconst onKeyDown = (event: KeyboardEvent) => {\n\t\tif (event.key !== 'Escape') return;\n\t\tif (isEditableTarget(event)) return;\n\t\t// Only claimed when a tool was actually active, so Escape still closes\n\t\t// popovers and dialogs the rest of the time.\n\t\tif (disarmTools()) event.preventDefault();\n\t};\n\n\ttarget.addEventListener('keydown', onKeyDown);\n\treturn () => target.removeEventListener('keydown', onKeyDown);\n}\n","/**\n * Keeps the gizmo modes from outliving the selection they act on.\n *\n * The Move/Rotate/Scale buttons are only shown while something is selected, so\n * a tool left active after the selection clears would be unreachable: no button\n * to toggle it off, and the game keeps the simulation paused for the whole time\n * a transform tool is held (see `StageTransformTool.setMode`). Escape already\n * offers a manual way out via `disarmTools`; this is the automatic one.\n */\n\nimport { subscribe } from 'valtio/vanilla';\n\nimport { debugState, setDebugTool, type DebugTools } from '../entities/entities-state';\nimport { sendTool } from '../../bridge/editor-bridge';\n\nconst TRANSFORM_TOOLS = new Set<DebugTools>(['translate', 'rotate', 'scale']);\n\n/** Whether a tool acts on the current selection. */\nexport function isTransformTool(tool: DebugTools): boolean {\n\treturn TRANSFORM_TOOLS.has(tool);\n}\n\n/**\n * Drop an active transform tool when nothing is selected.\n *\n * @returns `true` when a tool was reset.\n */\nexport function releaseOrphanedTransformTool(): boolean {\n\tif (debugState.selectedEntityIds.length > 0) return false;\n\tif (!isTransformTool(debugState.tool)) return false;\n\n\tsetDebugTool('none');\n\tsendTool('none');\n\treturn true;\n}\n\nexport interface TransformToolGuardOptions {\n\t/** @default true */\n\tenabled?: boolean;\n}\n\n/**\n * Watch the selection and release orphaned transform tools.\n *\n * @returns An uninstall function.\n */\nexport function installTransformToolGuard(\n\toptions: TransformToolGuardOptions = {},\n): () => void {\n\tif (options.enabled === false) return () => {};\n\n\treleaseOrphanedTransformTool();\n\treturn subscribe(debugState, () => {\n\t\treleaseOrphanedTransformTool();\n\t});\n}\n","import { Component, splitProps } from 'solid-js';\nimport { Dynamic } from 'solid-js/web';\nimport { LucideProps } from 'lucide-solid';\n\ninterface IconProps extends LucideProps {\n icon: Component<LucideProps>;\n}\n\nexport const Icon: Component<IconProps> = (props) => {\n const [local, others] = splitProps(props, ['icon', 'class']);\n\n return (\n <Dynamic\n component={local.icon}\n class={`text-current ${local.class || ''}`}\n {...others}\n />\n );\n};\n","/**\n * Editor Host Helpers\n *\n * Reusable wiring for apps that embed the <zylem-editor> overlay next to a\n * running Zylem game. These helpers are thin wrappers over the shared\n * `@zylem/bridge` channel: the game applies editor commands itself (via its\n * bridge adapter), so hosts only need this module to mount the overlay,\n * mirror editor commands into their own stores, or push state into the\n * editor UI.\n */\n\nimport { getZylemBridge, type BridgeDebugTool } from '@zylem/bridge';\nimport {\n\tsendDebugEnabled,\n\tsendPlayback,\n\tsendTool,\n} from '../bridge/editor-bridge';\nimport { debugState as editorDebugState } from '../components/entities/entities-state';\nimport { setDebugStore } from '../components/editor-store';\nimport {\n\tregisterZylemEditor,\n\ttype ZylemEditorElement,\n} from '../web-components/zylem-editor';\nimport type { EditorLauncherMode } from '../App';\nimport type { EditorDockDefaults } from '../components/editor-store';\nimport type { DockPanelId, DockSide } from '../components/common/dock-layout';\n\n/**\n * Nested state payload used by host-facing helpers.\n * Mirrors the historical `editor-state-dispatch` window-event shape so\n * existing hosts keep working; internally everything rides the bridge.\n */\nexport interface EditorUpdatePayload {\n\tgameState?: {\n\t\tdebugFlag?: boolean;\n\t\t[key: string]: unknown;\n\t};\n\ttoolbarState?: {\n\t\ttool?: BridgeDebugTool;\n\t\tpaused?: boolean;\n\t};\n\t[key: string]: unknown;\n}\n\nexport interface EditorStateBridgeOptions {\n\t/**\n\t * Called after each editor command has been sent to the game, so hosts\n\t * can mirror the payload into their own stores (e.g. a SolidJS store).\n\t */\n\tonStateDispatch?: (payload: EditorUpdatePayload) => void;\n}\n\nexport interface EditorStateBridge {\n\t/** Push external app state back into the editor UI. */\n\tdispatchToEditor(payload: EditorUpdatePayload): void;\n\t/** Remove the bridge subscriptions installed by this helper. */\n\tdispose(): void;\n}\n\n/**\n * Push a state update payload into the editor UI (stores + game command).\n * Safe to call in non-browser environments (no-op side effects only).\n */\nexport function dispatchToEditor(payload: EditorUpdatePayload): void {\n\tif (payload.gameState?.debugFlag !== undefined) {\n\t\tsetDebugStore('debug', payload.gameState.debugFlag);\n\t}\n\tif (payload.toolbarState?.tool !== undefined) {\n\t\teditorDebugState.tool = payload.toolbarState.tool;\n\t}\n\tif (payload.toolbarState?.paused !== undefined) {\n\t\teditorDebugState.paused = payload.toolbarState.paused;\n\t}\n}\n\n/**\n * Observe editor→game commands on the shared bridge.\n *\n * The game side applies commands itself; this helper exists so external\n * hosts can mirror editor actions (debug toggle, tool, pause) into their own\n * state via `onStateDispatch`.\n *\n * This deliberately does **not** open the editor's game→editor store\n * subscriptions. Those are owned by `<zylem-editor>` for the duration it is\n * mounted, and the game gates expensive work (thumbnail renders, entity\n * summaries) on them being present. A long-lived host helper holding one open\n * would keep that work running forever, even with no editor on screen. Hosts\n * that render editor components without the custom element should call\n * `connectEditorBridge()` directly and release it themselves.\n *\n * @example\n * ```ts\n * import { attachEditorStateBridge } from '@zylem/editor';\n * const bridge = attachEditorStateBridge();\n * // later: bridge.dispatchToEditor({ gameState: { debugFlag: false } });\n * ```\n */\nexport function attachEditorStateBridge(\n\toptions: EditorStateBridgeOptions = {},\n): EditorStateBridge {\n\tconst { channel } = getZylemBridge();\n\tconst unsubscribes = [\n\t\tchannel.on('debug:set', ({ enabled }) => {\n\t\t\toptions.onStateDispatch?.({ gameState: { debugFlag: enabled } });\n\t\t}),\n\t\tchannel.on('tool:set', ({ tool }) => {\n\t\t\toptions.onStateDispatch?.({ toolbarState: { tool } });\n\t\t}),\n\t\tchannel.on('playback:set', ({ paused }) => {\n\t\t\toptions.onStateDispatch?.({ toolbarState: { paused } });\n\t\t}),\n\t];\n\n\treturn {\n\t\tdispatchToEditor,\n\t\tdispose() {\n\t\t\tfor (const unsubscribe of unsubscribes) unsubscribe();\n\t\t},\n\t};\n}\n\n/**\n * Send an editor state payload as bridge commands to the running game.\n *\n * @deprecated Use the typed bridge commands (`sendDebugEnabled`, `sendTool`,\n * `sendPlayback`) instead. Kept for hosts migrating off the old\n * window-CustomEvent API.\n */\nexport function dispatchEditorUpdate(payload: EditorUpdatePayload): void {\n\tif (payload.gameState?.debugFlag !== undefined) {\n\t\tsendDebugEnabled(payload.gameState.debugFlag);\n\t}\n\tif (payload.toolbarState?.tool !== undefined) {\n\t\tsendTool(payload.toolbarState.tool);\n\t}\n\tif (payload.toolbarState?.paused !== undefined) {\n\t\tsendPlayback(payload.toolbarState.paused);\n\t}\n}\n\nexport interface MountZylemEditorOptions extends EditorStateBridgeOptions {\n\t/**\n\t * Controls the editor's floating launcher button.\n\t * @default 'floating'\n\t */\n\tlauncherMode?: EditorLauncherMode;\n\t/**\n\t * Dock layout to seed on first run, keyed by viewport edge. `'main'` is the\n\t * editor panel; any other id is a section such as `'console'`. Ignored once\n\t * the user has a saved layout.\n\t *\n\t * @example\n\t * ```ts\n\t * mountZylemEditor({ defaultDocks: { left: ['main'], bottom: ['console'] } });\n\t * ```\n\t */\n\tdefaultDocks?: EditorDockDefaults;\n\t/**\n\t * Element the <zylem-editor> overlay is appended to.\n\t * @default document.body\n\t */\n\ttarget?: HTMLElement;\n}\n\nexport interface MountedZylemEditor extends EditorStateBridge {\n\telement: ZylemEditorElement;\n\t/** Dock a panel to a viewport edge, or pass `null` to float it again. */\n\tdockPanel(side: DockSide | null, panelId?: DockPanelId): void;\n}\n\n/**\n * Imperatively mount a <zylem-editor> overlay and attach the state bridge.\n * Intended for non-JSX hosts (e.g. a plain-TS preview iframe).\n *\n * @example\n * ```ts\n * import { mountZylemEditor } from '@zylem/editor';\n * mountZylemEditor({ launcherMode: 'floating' });\n * ```\n */\nexport function mountZylemEditor(\n\toptions: MountZylemEditorOptions = {},\n): MountedZylemEditor {\n\tregisterZylemEditor();\n\n\tconst element = document.createElement('zylem-editor') as ZylemEditorElement;\n\telement.setAttribute('launcher-mode', options.launcherMode ?? 'floating');\n\tif (options.defaultDocks) {\n\t\t// Set before append: the config setter only reinitializes an element\n\t\t// that has already mounted.\n\t\telement.config = { ...element.config, defaultDocks: options.defaultDocks };\n\t}\n\t(options.target ?? document.body).appendChild(element);\n\n\tconst bridge = attachEditorStateBridge(options);\n\n\treturn {\n\t\telement,\n\t\tdispatchToEditor: bridge.dispatchToEditor,\n\t\tdockPanel(side, panelId) {\n\t\t\telement.dockPanel(side, panelId);\n\t\t},\n\t\tdispose() {\n\t\t\tbridge.dispose();\n\t\t\telement.remove();\n\t\t},\n\t};\n}\n"],"mappings":"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A;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;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;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;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;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAzB,IAAM,iBAAiB;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;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;;;ACGvB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAA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","names":["render","createContext","createMemo","createSignal","onMount","useContext","LayerCtx","createContext","LayerProvider","props","container","setContainer","createSignal","markerRef","onMount","ensureLayerContainer","_$createComponent","Provider","value","children","_el$","_tmpl$","_ref$","_$use","_$setStyleProperty","_$memo","useLayer","tier","rank","context","useContext","LayerCtx","fallback","setFallback","createSignal","anchor","onMount","ensureLayerContainer","zIndex","createMemo","offset","token","layerTierVars","mount","container","anchorRef","element","splitProps","Button","props","local","rest","_el$","_tmpl$","_$spread","_$mergeProps","_$memo","class","variant","size","_$insert","children","Button","KButton","Tooltip","KTooltip","Show","ToolbarButton","props","layer","useLayer","_$createComponent","KTooltip","Root","openDelay","children","Trigger","as","ref","r$","_ref$","anchorRef","KButton","label","onClick","disabled","_$memo","class","selected","undefined","Show","when","mount","keyed","Portal","Content","TextField","KTextField","Show","splitProps","NumberField","KNumberField","Show","Select","KSelect","Show","Checkbox","KCheckbox","Check","Show","Switch","KSwitch","Show","Slider","KSlider","Show","Tabs","KTabs","props","_$createComponent","Root","_$memo","class","value","onChange","defaultValue","children","TabsList","List","TabsTrigger","Trigger","disabled","TabsContent","Content","Accordion","KAccordion","For","Tooltip","KTooltip","Show","Tooltip","props","layer","useLayer","_$createComponent","KTooltip","Root","placement","openDelay","children","Trigger","as","ref","r$","_ref$","anchorRef","style","display","width","height","Show","when","mount","Portal","Content","content","DropdownMenu","KDropdownMenu","For","Show","Dialog","KDialog","Show","Show","PanelBottomClose","PanelBottomOpen","X","WindowControls","props","_$createComponent","when","onClose","onCollapse","children","_el$","_tmpl$3","_$insert","_el$2","_tmpl$","$$click","_c$","_$memo","collapsed","size","_$effect","_p$","_v$","_v$2","e","_$setAttribute","t","undefined","_el$3","_tmpl$2","_v$3","closeLabel","_v$4","_v$5","closeTestId","a","_$delegateEvents","Progress","KProgress","Show","Separator","KSeparator","Show","splitProps","Show","splitProps","splitProps","Show","createMemo","truncatePath","path","maxSegments","separator","includes","segments","split","filter","Boolean","length","truncated","isTruncated","slice","join","looksLikePath","value","test","startsWith","PropertyRow","props","display","createMemo","children","undefined","element","isClickable","fullValue","stringValue","shouldTruncate","isPath","maxPathSegments","onPathClick","_el$2","_tmpl$3","_el$3","firstChild","_$insert","label","_$createComponent","Show","when","fallback","_el$5","_tmpl$4","_$effect","_$className","valueClass","_el$4","_tmpl$2","$$click","_$delegateEvents","Show","Console","props","_el$","_tmpl$2","_el$2","firstChild","_el$3","$$input","event","onInput","currentTarget","value","_$setAttribute","_$insert","_$createComponent","Show","when","onClear","actions","children","_el$4","_tmpl$","Button","size","variant","onClick","_$effect","_p$","_v$","class","_v$2","readOnly","e","_$className","t","undefined","_$delegateEvents","Show","splitProps","Sidebar","props","local","rest","_el$","_tmpl$","_$spread","_$mergeProps","_$memo","class","_$insert","children","SidebarSection","_el$2","_tmpl$3","_$createComponent","when","title","_el$3","_tmpl$2","_$effect","_$className","SidebarItem","_el$4","_tmpl$4","active","undefined","Section","Item","Show","splitProps","Popover","KPopover","Show","createSignal","MenuButton","props","uncontrolledOpen","setUncontrolledOpen","createSignal","layer","useLayer","dismiss","createDismissGuard","isOpen","open","setOpen","onOpenChange","isSplit","onAction","undefined","tooltipText","tooltip","label","described","content","_$createComponent","Show","when","fallback","keyed","children","text","Tooltip","_el$","_tmpl$2","_$insert","KPopover","Root","placement","Trigger","ref","r$","_ref$","anchorRef","disabled","selected","_$memo","_tmpl$3","_el$4","_tmpl$4","$$click","_ref$2","_$use","_$effect","_p$","_v$3","_v$4","_v$5","e","_$setAttribute","t","a","_tmpl$","mount","Portal","Content","_ref$3","onInteractOutside","menu","_v$","class","_v$2","_$className","_$delegateEvents","For","Show","createMemo","createSignal","Search","SearchInput","props","_el$","_tmpl$","_el$2","firstChild","_$insert","_$createComponent","_$addEventListener","onKeyDown","$$input","event","onInput","currentTarget","value","_ref$","ref","_$use","_$effect","_p$","_v$","class","_v$2","placeholder","_v$3","e","_$className","t","_$setAttribute","a","undefined","_$delegateEvents","ItemPicker","props","query","setQuery","createSignal","searchable","groups","createMemo","groupItems","filterItems","items","_el$","_tmpl$2","_$insert","_$createComponent","Show","when","children","SearchInput","value","onInput","placeholder","searchPlaceholder","ref","element","autoFocus","queueMicrotask","focus","length","fallback","_el$3","_tmpl$3","emptyMessage","_el$4","_tmpl$4","_el$5","firstChild","_el$7","nextSibling","_el$6","_el$2","_tmpl$","For","each","group","_el$8","_tmpl$5","_el$9","item","_el$0","_tmpl$6","_el$1","$$click","onSelect","icon","_el$10","_tmpl$7","_$effect","innerHTML","label","_p$","_v$","disabled","_v$2","selectedId","id","undefined","_v$3","description","e","t","_$setAttribute","a","_$className","class","_$delegateEvents","Show","splitProps","render","createMemo","createSignal","For","onCleanup","onMount","Show","Show","Trash2","proxy","proxy","proxy","proxy","createContext","useContext","onCleanup","createStore","reconcile","subscribe","EditorContext","createContext","EditorProvider","props","debug","setDebug","createStore","debugState","game","setGame","gameState","stage","setStage","stageState","unsubDebug","subscribe","paused","tool","selectedEntityId","hoveredEntityId","nextFlags","flags","size","some","flag","has","Set","unsubGame","id","time","reconcile","globals","config","unsubStage","backgroundColor","backgroundImage","inputs","variables","gravity","entities","key","onCleanup","value","_$createComponent","Provider","children","useEditor","context","useContext","Error","proxy","proxy","channel","getZylemBridge","createStore","proxy","createStore","reconcile","subscribe","proxy","proxy","proxy","getZylemBridge","thumbnails","snap","DeleteButton","handleClick","newTool","debugStore","tool","setDebugTool","sendTool","_$createComponent","ToolbarButton","label","selected","onClick","children","Trash2","Plus","createMemo","Show","unwrap","AddButton","isArmed","isAddArmed","debugStore","tool","catalogStore","armedTypeId","find","id","entities","entity","target","createMemo","resolvePlacementTarget","lastTypeId","items","toPickerItems","arm","descriptor","setArmedType","sendAddType","unwrap","defaultProps","setDebugTool","sendTool","armTarget","_el$","_tmpl$","_$insert","_$createComponent","MenuButton","label","_$memo","selected","disabled","length","onAction","menu","close","ItemPicker","selectedId","searchPlaceholder","emptyMessage","onSelect","item","children","Show","when","icon","fallback","Plus","_el$2","_tmpl$2","_$effect","innerHTML","MousePointer","SelectButton","handleClick","newTool","debugStore","tool","setDebugTool","sendTool","_$createComponent","ToolbarButton","label","selected","onClick","children","MousePointer","Pause","Play","PlayPauseButton","handleClick","newPaused","debugState","paused","setPaused","sendPlayback","_$createComponent","ToolbarButton","label","debugStore","selected","onClick","children","_$memo","Play","Pause","Bug","DebugButton","handleClick","newDebug","debugStore","debug","setDebugStore","sendDebugEnabled","_$createComponent","ToolbarButton","label","selected","onClick","children","Bug","Grid3x3","Magnet","proxy","subscribe","proxy","subscribe","GridButton","_$createComponent","ToolbarButton","label","transformStore","gridVisible","selected","onClick","setGridVisible","children","Grid3x3","SnapButton","enabled","setSnapEnabled","Magnet","Redo2","Undo2","lastLabel","stack","length","label","UndoButton","next","historyStore","undoStack","_$createComponent","ToolbarButton","onClick","undo","children","Undo2","RedoButton","redoStack","redo","Redo2","Move3d","Rotate3d","Scale3d","createMemo","TransformToolButton","props","stage","useEditor","target","createMemo","resolveTransformTarget","debugStore","selected","lastTouched","entities","map","entity","uuid","filter","Boolean","handleClick","nextTool","tool","setArmedType","sendAddType","length","setSelectedEntityId","sendEntitySelect","setDebugTool","sendTool","_$createComponent","ToolbarButton","label","disabled","onClick","children","TranslateButton","Move3d","RotateButton","Rotate3d","ScaleButton","Scale3d","Toolbar","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$7","_$insert","_$createComponent","DebugButton","SelectButton","TranslateButton","RotateButton","ScaleButton","AddButton","DeleteButton","SnapButton","GridButton","UndoButton","RedoButton","PlayPauseButton","Accordion","Index","Show","Show","GameSection","game","useEditor","_el$","_tmpl$4","_el$20","firstChild","_$insert","_$createComponent","Show","when","config","children","_el$2","_tmpl$3","_el$3","_el$4","_el$5","nextSibling","_el$6","_el$7","_el$8","_el$9","_el$0","_el$1","_el$10","_el$11","_el$12","id","aspectRatio","toFixed","fullscreen","debug","internalResolution","_el$13","_tmpl$","_el$14","_el$15","_el$16","width","height","bodyBackground","_el$17","_tmpl$2","_el$18","_el$19","Button","size","onClick","printToConsole","JSON","stringify","globals","Show","record","PropertyRow","props","_$createComponent","UIPropertyRow","label","value","isPath","maxPathSegments","valueClass","onPathClick","fullValue","printToConsole","children","StageSection","stage","useEditor","_el$","_tmpl$2","_el$3","firstChild","_$insert","_$createComponent","Show","when","config","children","_el$2","_tmpl$","PropertyRow","label","value","id","backgroundColor","backgroundImage","isPath","_$memo","gravity","x","toFixed","y","z","Object","keys","variables","length","Button","size","onClick","printToConsole","stageStateToString","stageState","copyStageExport","then","json","entities","stageExportToString","For","Show","Box","Type","Square","Grid3x3","Torus","PersonStanding","GhostIcon","SquareDashed","Globe","ICON_MAP","Sphere","Disk","Sprite","Actor","Text","Rect","Plane","Zone","EntityIcon","props","IconComponent","type","_$createComponent","class","formatDim","value","Number","isFinite","toFixed","EntityThumbnail","props","widthLabel","bounds","width","heightLabel","height","depthLabel","depth","hasBounds","Boolean","caption","name","type","_el$","_tmpl$4","_el$2","firstChild","_el$3","_$insert","_$createComponent","Show","when","thumbnail","fallback","EntityIcon","children","src","_el$10","_tmpl$5","_$setAttribute","_$effect","_p$","_v$","_v$2","e","t","undefined","_el$4","_tmpl$","_el$5","_el$6","nextSibling","_el$7","_tmpl$2","_el$8","_el$9","_el$0","_tmpl$3","_el$1","handleEntityClick","entity","uuid","printToConsole","JSON","stringify","setSelectedEntityId","sendEntitySelect","sendEntityFocus","setDebugStore","EntitiesSection","stage","useEditor","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","_el$6","nextSibling","_el$5","_el$7","_$insert","entities","length","_$createComponent","For","each","children","_el$8","_tmpl$2","$$click","EntityThumbnail","type","name","thumbnail","getEntityThumbnail","url","bounds","_$effect","_$setAttribute","_$delegateEvents","createMemo","For","Show","DECIMALS","AXES","round","value","factor","Math","snap","increment","transformStore","enabled","TransformSection","debug","stage","useEditor","selected","createMemo","uuid","selectedEntityId","entities","find","entity","displayValue","channel","axis","rotation","PI","fallback","commit","raw","parsed","Number","parseFloat","isFinite","degreeSnap","rotate","radians","x","y","z","sendEntityTransform","scale","translate","safe","position","row","label","_el$","_tmpl$","_el$2","firstChild","_$insert","_$createComponent","For","each","children","_el$3","_tmpl$2","addEventListener","event","currentTarget","_$effect","_$setAttribute","toUpperCase","_el$4","_tmpl$4","_el$6","_el$7","_el$8","_el$9","nextSibling","_el$0","_el$1","_el$10","_el$14","_el$11","_el$15","_el$12","_el$16","_el$13","Show","when","_tmpl$5","_el$5","_tmpl$3","setSnapEnabled","checked","setGridVisible","gridVisible","createSignal","onCleanup","subscribe","Console","consoleContent","setConsoleContent","createSignal","consoleState","messages","join","previousMessageCount","length","unsubscribe","subscribe","nextCount","appendedText","slice","prev","onCleanup","_$createComponent","UIConsole","value","onInput","onClear","clearConsole","For","Show","createSignal","onCleanup","onMount","subscribe","BridgePanel","stats","setStats","createSignal","entries","setEntries","paused","setPaused","bridgePanelState","dropped","setDropped","onMount","startBridgeCapture","unsubscribe","subscribe","onCleanup","stopBridgeCapture","togglePaused","setBridgeCapturePaused","totalRate","reduce","sum","row","rate","_el$","_tmpl$3","_el$2","firstChild","_el$3","_el$4","_el$8","nextSibling","_el$9","_el$0","_el$13","_$insert","_$createComponent","Button","size","onClick","children","clearBridgeLog","toFixed","Show","when","length","fallback","_tmpl$4","_el$5","_tmpl$","_el$6","_el$7","For","each","_el$15","_tmpl$5","_el$16","_el$17","_el$18","_el$20","_el$19","type","sent","formatBytes","bytes","_c$","_$memo","retained","_$effect","_p$","_v$","BRIDGE_RATE_WARNING","_v$2","queued","delivered","coalesced","listeners","e","classList","toggle","t","_$setAttribute","undefined","_el$1","_tmpl$2","_el$10","_el$12","_el$11","slice","reverse","_tmpl$6","entry","_el$22","_tmpl$7","_el$23","_el$24","_el$25","_el$26","kind","summary","_$className","PANEL_CONFIGS","id","title","component","GameSection","StageSection","EntitiesSection","TransformSection","Console","BridgePanel","getPanelConfig","find","p","getPanelTitle","renderPanelContent","config","PanelComponent","_$createComponent","Accordion","createSignal","onCleanup","onMount","Show","Portal","DRAG_THRESHOLD","DraggableAccordionItem","props","layer","useLayer","PANEL_RANK","dragGhost","itemRef","headerRef","menuPanelRef","isDragging","setIsDragging","createSignal","ghostPos","setGhostPos","x","y","headerSize","setHeaderSize","width","height","dragStartPos","isPointerDown","getCurrentIndex","detachedIds","Object","keys","debugStore","detachedPanels","dockedPanels","panelOrder","filter","id","includes","indexOf","value","handlePointerDown","e","button","clientX","clientY","closest","rect","getBoundingClientRect","pointerType","preventDefault","handlePointerMove","deltaX","deltaY","distance","Math","sqrt","setDraggingPanel","panelRect","isInsidePanel","left","right","top","bottom","accordion","querySelector","accordionItems","querySelectorAll","dropIndex","i","length","item","itemRect","itemMiddle","setDropTargetIndex","handlePointerUp","wasDragging","isOutside","detachPanel","dropTargetIndex","currentIndex","newOrder","insertIndex","splice","fullOrder","forEach","push","reorderPanels","clearDragState","onMount","window","addEventListener","onCleanup","removeEventListener","_$createComponent","Accordion","Item","ref","r$","_ref$","children","Header","_ref$2","onPointerDown","style","Trigger","title","Content","Show","when","_$memo","mount","Portal","_el$","_tmpl$","_el$2","firstChild","_$setStyleProperty","_$insert","_$effect","_p$","_v$","_v$2","_v$3","_v$4","_v$5","zIndex","t","a","o","undefined","AccordionMenu","getDockedPanels","detachedIds","Object","keys","debugStore","detachedPanels","panelOrder","filter","id","includes","map","PANEL_CONFIGS","find","p","undefined","isDraggingToReattach","draggingPanelId","dropTargetIndex","_$createComponent","Accordion","Root","multiple","value","openSections","onChange","setOpenSections","children","Show","when","_$memo","_tmpl$","Index","each","panel","index","DraggableAccordionItem","title","renderPanelContent","Menu","props","_el$","_tmpl$","_$insert","_$createComponent","Toolbar","Show","when","isCollapsed","children","AccordionMenu","createSignal","onCleanup","onMount","SNAP_THRESHOLD","DRAG_THRESHOLD","BUTTON_SIZE","BUTTON_MARGIN","EditorToggleButton","props","layer","useLayer","PANEL_RANK","toggleButton","position","setPosition","createSignal","x","y","resizeRaf","isDragging","dragStartPos","buttonStartPos","hasMoved","snapToCorner","windowWidth","window","innerWidth","windowHeight","innerHeight","snappedX","snappedY","clampToViewport","maxX","Math","max","maxY","min","handlePointerDown","e","clientX","clientY","pointerType","preventDefault","handlePointerMove","deltaX","deltaY","abs","newX","newY","clampedX","clampedY","handlePointerUp","currentPos","snappedPos","setToggleButtonPosition","onToggle","handleResize","undefined","cancelAnimationFrame","requestAnimationFrame","clampedPos","onMount","initialPos","addEventListener","onCleanup","removeEventListener","_el$","_tmpl$","_el$2","firstChild","_$setStyleProperty","$$pointerdown","_$effect","_p$","_v$","_v$2","_v$3","zIndex","t","a","_$delegateEvents","createEffect","createSignal","onCleanup","onMount","createEffect","createSignal","For","onCleanup","Show","Dynamic","Portal","PanelBottom","PanelLeft","PanelRight","PanelTop","DOCK_OPTIONS","side","label","icon","DockMenu","props","open","setOpen","createSignal","anchor","setAnchor","top","right","layer","useLayer","wrapperRef","triggerRef","menuRef","attachWrapper","element","anchorRef","triggerIcon","find","option","dockedSide","measure","rect","getBoundingClientRect","bottom","Math","max","window","innerWidth","toggle","createEffect","onOutsidePointerDown","event","path","composedPath","includes","onKeyDown","key","document","addEventListener","onCleanup","removeEventListener","_el$","_tmpl$2","_el$2","firstChild","$$pointerdown","stopPropagation","_$use","_$setStyleProperty","$$click","_ref$","_$insert","_$createComponent","Dynamic","component","size","Show","when","_$memo","mount","children","Portal","_el$3","_tmpl$","_ref$2","For","each","active","_el$4","_tmpl$3","onDock","_$effect","_p$","_v$4","_v$5","_v$6","_v$7","undefined","_v$8","e","_$setAttribute","t","a","o","i","_v$","_v$2","_v$3","zIndex","_$delegateEvents","createEffect","createMemo","createSignal","Show","untrack","Portal","createSignal","SNAP_PREVIEW_THRESHOLD","GHOST_SIZE","width","height","createPanelDocking","options","undockedSize","setUndockedSize","createSignal","initialSize","dockPreview","setDockPreview","visible","side","index","dockedSide","createMemo","findDockedSide","debugStore","docks","panelId","isDocked","dockRect","layout","computeDockLayout","viewportSize","minSlotExtent","createEffect","rect","untrack","currentPos","position","currentSize","size","x","y","setPosition","setSize","isAutoHeightSignal","setIsAutoHeight","isAutoHeight","isMoving","setIsMoving","ghostRestoreAutoHeight","showDockPreview","hideDockPreview","rememberUndockedSize","nextSize","getLiveSize","panelElement","panelRef","getBoundingClientRect","getDockPreviewRect","preview","previewDockRect","clampSizeToViewport","viewport","maxWidth","Math","max","maxHeight","minWidth","min","minSize","minHeight","fitPanelToViewport","currentX","currentY","currentWidth","currentHeight","fittedSize","maxX","maxY","detectDockSide","overflows","amount","best","reduce","a","b","detectDockIndex","pointerX","pointerY","dockSlotIndex","beginDragGhost","ghost","pointerRatioX","pointerRatioY","fitted","undockPanelFromSides","endDragGhost","preferred","restored","onSizeCommit","onPositionCommit","beginResize","direction","innerEdgeFor","mode","resizeDockThickness","startThickness","deltaX","deltaY","horizontal","isHorizontalSide","delta","signed","minThickness","next","clampThickness","setDockThickness","clearDockedSide","applyDockPreview","dockPanelToSide","restoreUndockedPanel","dockTo","fitFloatingPanelToViewport","DockPreviewOverlay","props","layer","useLayer","rank","_$createComponent","Show","when","children","previewRect","mount","keyed","Portal","_el$","_tmpl$","_$setStyleProperty","_$effect","_p$","_v$","_v$2","_v$3","_v$4","_v$5","zIndex","e","t","o","i","undefined","DRAG_THRESHOLD","FloatingPanel","props","layer","useLayer","PANEL_RANK","mainPanel","minSize","width","height","initialPanelSize","initialSize","position","setPosition","createSignal","initialPosition","x","y","size","setSize","isCollapsed","setIsCollapsed","toggleCollapse","isDragging","isResizing","resizeMode","resizeDirection","dragStartPos","panelStartPos","panelStartSize","startThickness","hasMoved","panelRef","dockedSide","isAutoHeight","showDockPreview","hideDockPreview","rememberUndockedSize","getLiveSize","getDockPreviewRect","detectDockSide","detectDockIndex","beginDragGhost","endDragGhost","isMoving","clampSizeToViewport","beginResize","resizeDockThickness","applyDockPreview","dockTo","createPanelDocking","panelId","MAIN_PANEL_ID","floatingSize","onPositionCommit","nextPosition","onMove","onSizeCommit","nextSize","onResize","createEffect","request","dockRequest","side","clampPosition","padding","Math","max","min","window","innerWidth","innerHeight","clampSize","handleTitleBarPointerDown","e","clientX","clientY","pointerType","preventDefault","handleResizePointerDown","direction","currentSize","mode","isHorizontalSide","stopPropagation","handlePointerMove","deltaX","deltaY","abs","fitted","proposedX","proposedY","liveSize","dockSide","newPos","newWidth","newHeight","newX","newY","includes","clampedSize","handlePointerUp","onMount","addEventListener","onCleanup","removeEventListener","resizeHandleStyle","cursor","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$7","_el$8","_el$9","_el$0","_el$1","_el$10","_el$11","_ref$","_$use","_$insert","_$createComponent","DockPreviewOverlay","rect","rank","mainDockPreview","$$pointerdown","_$setStyleProperty","title","DockMenu","onDock","WindowControls","collapsed","onCollapse","collapsible","undefined","onClose","closeTestId","_c$","_$memo","children","_$addEventListener","_$effect","_p$","_v$","left","top","zIndex","display","background","border","_v$2","_v$3","_v$4","_v$5","right","_v$6","bottom","_v$7","_v$8","_v$9","_v$0","_v$1","_v$10","_$style","t","a","o","i","n","s","h","r","d","l","u","_$delegateEvents","createSignal","onCleanup","onMount","DRAG_THRESHOLD","MIN_WIDTH","MIN_HEIGHT","DetachedPanel","props","panelState","debugStore","detachedPanels","panelId","rank","PANEL_RANK","detachedBase","panelZOrder","indexOf","layer","useLayer","initialPanelSize","size","width","height","position","setPosition","createSignal","x","y","setSize","isDragging","isResizing","resizeMode","resizeDirection","dragStartPos","panelStartPos","panelStartSize","startThickness","hasMoved","panelRef","dockedSide","isAutoHeight","showDockPreview","hideDockPreview","rememberUndockedSize","getLiveSize","getDockPreviewRect","detectDockSide","detectDockIndex","beginDragGhost","endDragGhost","isMoving","clampSizeToViewport","beginResize","resizeDockThickness","applyDockPreview","createPanelDocking","initialSize","minSize","onPositionCommit","nextPosition","updateDetachedPanelPosition","onSizeCommit","nextSize","updateDetachedPanelSize","handlePanelPointerDown","bringPanelToFront","handleTitleBarPointerDown","e","clientX","clientY","pointerType","preventDefault","handleResizePointerDown","direction","side","currentSize","mode","isHorizontalSide","stopPropagation","handlePointerMove","deltaX","deltaY","Math","abs","setDraggingPanel","fitted","proposedX","proposedY","dockSide","setDropTargetIndex","newPos","max","min","window","innerWidth","innerHeight","editorPanel","document","querySelector","panelRect","getBoundingClientRect","isOverPanel","left","right","top","bottom","accordionItems","querySelectorAll","dropIndex","i","length","item","itemRect","itemMiddle","newWidth","newHeight","newX","newY","includes","proposedWidth","proposedHeight","clampedSize","maxX","maxY","handlePointerUp","dropTargetIndex","reattachPanel","clearDragState","handleClose","onMount","addEventListener","onCleanup","removeEventListener","resizeHandleStyle","cursor","_el$","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_el$7","_el$8","_el$9","_el$0","_el$1","_el$10","$$pointerdown","_ref$","_$use","_$insert","_$createComponent","DockPreviewOverlay","rect","getPanelTitle","WindowControls","onClose","closeLabel","renderPanelContent","_$addEventListener","_$effect","_p$","_v$","zIndex","undefined","background","border","_v$2","_v$3","_v$4","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","_v$1","_v$10","_$style","t","_$setStyleProperty","a","o","n","s","h","r","d","l","u","_$delegateEvents","PANEL_WIDTH","PANEL_HEIGHT","PANEL_MARGIN","VIEWPORT_PANEL_MARGIN","MOBILE_BOTTOM_BAR_ALLOWANCE","getViewportFittedPanelLayout","bottomOffset","inset","availableWidth","Math","max","window","innerWidth","availableHeight","innerHeight","width","min","height","topInset","bottomLimit","centeredY","round","initialPosition","x","y","initialSize","getInitialPanelPosition","debugStore","panelPosition","buttonPos","toggleButtonPosition","windowWidth","windowHeight","isRightSide","isBottomSide","Editor","props","isOpen","setIsOpen","createSignal","dockRequest","setDockRequest","launcherMode","applyDefaultDocks","defaultDocks","toggleMenu","open","closeMenu","openMenu","handlePanelMove","pos","setPanelPosition","mainDockedSide","findDockedSide","docks","MAIN_PANEL_ID","getDetachedPanelIds","Object","keys","detachedPanels","shouldViewportFitPanel","panelLayout","createMemo","rect","computeDockLayout","viewportSize","fallback","panelSize","controller","openPanel","closePanel","togglePanel","dockPanel","side","panelId","previous","nonce","undockPanelFromSides","isPanelDetached","detachPanel","dockPanelToSide","onMount","onControllerReady","onCleanup","_$createComponent","LayerProvider","children","_el$","_tmpl$","_el$2","firstChild","_$setStyleProperty","_$insert","Show","when","EditorToggleButton","onToggle","FloatingPanel","title","floatingSize","minSize","collapsible","onClose","onMove","onResize","setPanelSize","isCollapsed","Menu","For","each","DetachedPanel","import","env","VITEST","container","document","getElementById","render","App","props","_$createComponent","Editor","launcherMode","defaultDocks","onControllerReady","subscribe","subscribe","normalizeLauncherMode","value","normalizeDockDefaults","source","JSON","parse","undefined","defaults","side","DOCK_SIDES","panels","Array","isArray","ids","filter","id","length","Object","keys","ZylemEditorElement","HTMLElement","dispose","_config","_initialized","controller","releaseBridge","teardownHooks","constructor","attachShadow","mode","config","reinitialize","launcherMode","normalized","observedAttributes","attributeChangedCallback","name","_oldValue","newValue","includeStyles","defaultDocks","connectedCallback","initialize","connectEditorBridge","connectTransformState","installHistoryShortcuts","enabled","enableUndoShortcut","installToolShortcuts","enableEscapeShortcut","installTransformToolGuard","styleElement","document","createElement","textContent","zylemCSS","entityPreviewCSS","bridgePanelCSS","addPaletteCSS","shadowRoot","appendChild","div","style","width","height","render","_self$","_$createComponent","EditorProvider","children","App","onControllerReady","openPanel","closePanel","togglePanel","dockPanel","panelId","teardown","firstChild","removeChild","disconnectedCallback","registerZylemEditor","tagName","customElements","get","define","window","splitProps","Dynamic","Icon","props","local","others","_$createComponent","_$mergeProps","component","icon","class","getZylemBridge","channel","getZylemBridge","unsubscribes"]}